diff options
-rw-r--r-- | dist/plyr.js | 495 | ||||
-rw-r--r-- | dist/plyr.js.map | 2 | ||||
-rw-r--r-- | dist/plyr.min.js | 2 | ||||
-rw-r--r-- | dist/plyr.min.js.map | 2 | ||||
-rw-r--r-- | dist/plyr.polyfilled.js | 521 | ||||
-rw-r--r-- | dist/plyr.polyfilled.js.map | 2 | ||||
-rw-r--r-- | dist/plyr.polyfilled.min.js | 2 | ||||
-rw-r--r-- | dist/plyr.polyfilled.min.js.map | 2 | ||||
-rw-r--r-- | readme.md | 3 | ||||
-rw-r--r-- | src/js/captions.js | 10 | ||||
-rw-r--r-- | src/js/controls.js | 12 | ||||
-rw-r--r-- | src/js/fullscreen.js | 8 | ||||
-rw-r--r-- | src/js/html5.js | 85 | ||||
-rw-r--r-- | src/js/listeners.js | 64 | ||||
-rw-r--r-- | src/js/plugins/ads.js | 4 | ||||
-rw-r--r-- | src/js/plugins/vimeo.js | 34 | ||||
-rw-r--r-- | src/js/plugins/youtube.js | 113 | ||||
-rw-r--r-- | src/js/plyr.js | 66 | ||||
-rw-r--r-- | src/js/ui.js | 4 | ||||
-rw-r--r-- | src/js/utils/events.js | 35 |
20 files changed, 668 insertions, 798 deletions
diff --git a/dist/plyr.js b/dist/plyr.js index 29264940..b694b070 100644 --- a/dist/plyr.js +++ b/dist/plyr.js @@ -95,7 +95,11 @@ var supportsPassiveListeners = function () { function toggleListener(elements, event, callback) { var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + + var _this = this; + var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + var once = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false; // Bail if no elemetns, event, or callback if (is.empty(elements) || is.empty(event) || !is.function(callback)) { @@ -133,6 +137,11 @@ function toggleListener(elements, event, callback) { // If a single node is passed, bind the event listener events.forEach(function (type) { + if (_this && _this.eventListeners && toggle && !once) { + // Cache event listener + _this.eventListeners.push({ elements: elements, type: type, callback: callback, options: options }); + } + elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); }); } @@ -144,7 +153,7 @@ function on(element) { var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener(element, events, callback, true, passive, capture); + toggleListener.call(this, element, events, callback, true, passive, capture); } // Unbind event handler @@ -154,11 +163,31 @@ function off(element) { var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener(element, events, callback, false, passive, capture); + toggleListener.call(this, element, events, callback, false, passive, capture); +} + +// Bind once-only event handler +function once(element) { + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var callback = arguments[2]; + var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + function onceCallback() { + off(element, events, onceCallback, passive, capture); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + } + + toggleListener(element, events, onceCallback, true, passive, capture, true); } // Trigger event -function trigger(element) { +function triggerEvent(element) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; @@ -180,6 +209,22 @@ function trigger(element) { element.dispatchEvent(event); } +// Unbind all cached event listeners +function unbindListeners() { + if (this && this.eventListeners) { + this.eventListeners.forEach(function (item) { + var elements = item.elements, + type = item.type, + callback = item.callback, + options = item.options; + + elements.removeEventListener(type, callback, options); + }); + + this.eventListeners = []; + } +} + var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); @@ -744,67 +789,29 @@ var support = { // ========================================================================== -// Remove duplicates in an array -function dedupe(array) { - if (!is.array(array)) { - return array; - } - - return array.filter(function (item, index) { - return array.indexOf(item) === index; - }); -} - -// Get the closest value in an array -function closest(array, value) { - if (!is.array(array) || !array.length) { - return null; - } - - return array.reduce(function (prev, curr) { - return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; - }); -} - -// ========================================================================== - var html5 = { getSources: function getSources() { - if (!this.isHTML5) { - return null; - } - - return this.media.querySelectorAll('source'); - }, - + var _this = this; - // Get quality levels - getQualityOptions: function getQualityOptions() { if (!this.isHTML5) { - return null; + return []; } - // Get sources - var sources = html5.getSources.call(this); - - if (is.empty(sources)) { - return null; - } + var sources = Array.from(this.media.querySelectorAll('source')); - // Get <source> with size attribute - var sizes = Array.from(sources).filter(function (source) { - return !is.empty(source.getAttribute('size')); + // Filter out unsupported sources + return sources.filter(function (source) { + return support.mime.call(_this, source.getAttribute('type')); }); + }, - // If none, bail - if (is.empty(sizes)) { - return null; - } - // Reduce to unique list - return dedupe(sizes.map(function (source) { + // Get quality levels + getQualityOptions: function getQualityOptions() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { return Number(source.getAttribute('size')); - })); + }).filter(Boolean); }, extend: function extend() { if (!this.isHTML5) { @@ -815,71 +822,48 @@ var html5 = { // Quality Object.defineProperty(player.media, 'quality', { - get: function get() { + get: function get$$1() { // Get sources var sources = html5.getSources.call(player); - if (is.empty(sources)) { - return null; - } - - var matches$$1 = Array.from(sources).filter(function (source) { + var _sources$filter = sources.filter(function (source) { return source.getAttribute('src') === player.source; - }); + }), + _sources$filter2 = slicedToArray(_sources$filter, 1), + source = _sources$filter2[0]; - if (is.empty(matches$$1)) { - return null; - } + // Return size, if match is found - return Number(matches$$1[0].getAttribute('size')); + + return source && Number(source.getAttribute('size')); }, - set: function set(input) { + set: function set$$1(input) { // Get sources var sources = html5.getSources.call(player); - if (is.empty(sources)) { - return; - } - - // Get matches for requested size - var matches$$1 = Array.from(sources).filter(function (source) { + // Get first match for requested size + var source = sources.find(function (source) { return Number(source.getAttribute('size')) === input; }); - // No matches for requested size - if (is.empty(matches$$1)) { + // No matching source found + if (!source) { return; } - // Get supported sources - var supported = matches$$1.filter(function (source) { - return support.mime.call(player, source.getAttribute('type')); - }); - - // No supported sources - if (is.empty(supported)) { - return; - } - - // Trigger change event - trigger.call(player, player.media, 'qualityrequested', false, { - quality: input - }); - // Get current state var currentTime = player.currentTime, playing = player.playing; // Set new source - player.media.src = supported[0].getAttribute('src'); + player.media.src = source.getAttribute('src'); // Restore time var onLoadedMetaData = function onLoadedMetaData() { player.currentTime = currentTime; - player.off('loadedmetadata', onLoadedMetaData); }; - player.on('loadedmetadata', onLoadedMetaData); + player.once('loadedmetadata', onLoadedMetaData); // Load new source player.media.load(); @@ -890,7 +874,7 @@ var html5 = { } // Trigger change event - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: input }); } @@ -906,7 +890,7 @@ var html5 = { } // Remove child sources - removeElement(html5.getSources()); + removeElement(html5.getSources.call(this)); // Set blank video src attribute // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error @@ -1103,6 +1087,30 @@ var i18n = { // ========================================================================== +// Remove duplicates in an array +function dedupe(array) { + if (!is.array(array)) { + return array; + } + + return array.filter(function (item, index) { + return array.indexOf(item) === index; + }); +} + +// Get the closest value in an array +function closest(array, value) { + if (!is.array(array) || !array.length) { + return null; + } + + return array.reduce(function (prev, curr) { + return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; + }); +} + +// ========================================================================== + var Storage = function () { function Storage(player) { classCallCheck(this, Storage); @@ -1916,7 +1924,6 @@ var controls = { // Set the quality menu - // TODO: Vimeo support setQualityMenu: function setQualityMenu(options) { var _this3 = this; @@ -1928,9 +1935,9 @@ var controls = { var type = 'quality'; var list = this.elements.settings.panes.quality.querySelector('ul'); - // Set options if passed and filter based on config + // Set options if passed and filter based on uniqueness and config if (is.array(options)) { - this.options.quality = options.filter(function (quality) { + this.options.quality = dedupe(options).filter(function (quality) { return _this3.config.quality.options.includes(quality); }); } @@ -2351,13 +2358,10 @@ var controls = { // Revert back to auto container.style.width = ''; container.style.height = ''; - - // Only listen once - off(container, transitionEndEvent, restore); }; // Listen for the transition finishing and restore auto height/width - on(container, transitionEndEvent, restore); + once(container, transitionEndEvent, restore); // Set dimensions to target container.style.width = size.width + 'px'; @@ -2902,7 +2906,7 @@ var captions = { // Watch changes to textTracks and update captions menu if (this.isHTML5) { var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; - on(this.media.textTracks, trackEvents, captions.update.bind(this)); + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); } // Update available languages in list next tick (the event must not be triggered before the listeners) @@ -2933,7 +2937,7 @@ var captions = { track.mode = 'hidden'; // Add event listener for cue changes - on(track, 'cuechange', function () { + on.call(_this, track, 'cuechange', function () { return captions.updateCues.call(_this); }); }); @@ -3004,7 +3008,7 @@ var captions = { } // Trigger event - trigger.call(this, this.media, 'languagechange'); + triggerEvent.call(this, this.media, 'languagechange'); } if (this.isHTML5 && this.isVideo) { @@ -3140,7 +3144,7 @@ var captions = { this.elements.captions.appendChild(caption); // Trigger event - trigger.call(this, this.media, 'cuechange'); + triggerEvent.call(this, this.media, 'cuechange'); } } }; @@ -3566,7 +3570,7 @@ function onChange() { } // Trigger an event - trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container if (!browser.isIos) { @@ -3615,13 +3619,13 @@ var Fullscreen = function () { // Register event listeners // Handle event (incase user presses escape etc) - on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () { + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () { // TODO: Filter for target?? onChange.call(_this); }); // Fullscreen toggle on double click - on(this.player.elements.container, 'dblclick', function (event) { + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { // Ignore double click in controls if (is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) { return; @@ -3905,7 +3909,7 @@ var ui = { // Ready event at end of execution stack setTimeout(function () { - trigger.call(_this, _this.media, 'ready'); + triggerEvent.call(_this, _this.media, 'ready'); }, 0); // Set the title @@ -4230,9 +4234,6 @@ var Listeners = function () { // Add touch class toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true); - - // Clean up - off(document.body, 'touchstart', this.firstTouch); } // Global window & document listeners @@ -4244,14 +4245,14 @@ var Listeners = function () { // Keyboard shortcuts if (this.player.config.keyboard.global) { - toggleListener(window, 'keydown keyup', this.handleKey, toggle, false); + toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false); } // Click anywhere closes menu - toggleListener(document.body, 'click', this.toggleMenu, toggle); + toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events - on(document.body, 'touchstart', this.firstTouch); + once(document.body, 'touchstart', this.firstTouch); } // Container listeners @@ -4263,17 +4264,16 @@ var Listeners = function () { // Keyboard shortcuts if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) { - on(this.player.elements.container, 'keydown keyup', this.handleKey, false); + on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false); } // Detect tab focus // Remove class on blur/focusout - on(this.player.elements.container, 'focusout', function (event) { + on.call(this.player, this.player.elements.container, 'focusout', function (event) { toggleClass(event.target, _this2.player.config.classNames.tabFocus, false); }); - // Add classname to tabbed elements - on(this.player.elements.container, 'keydown', function (event) { + on.call(this.player, this.player.elements.container, 'keydown', function (event) { if (event.keyCode !== 9) { return; } @@ -4286,7 +4286,7 @@ var Listeners = function () { }); // Toggle controls on mouse events and entering fullscreen - on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { var controls$$1 = _this2.player.elements.controls; // Remove button states for fullscreen @@ -4324,24 +4324,24 @@ var Listeners = function () { var _this3 = this; // Time change on media - on(this.player.media, 'timeupdate seeking seeked', function (event) { + on.call(this.player, this.player.media, 'timeupdate seeking seeked', function (event) { return controls.timeUpdate.call(_this3.player, event); }); // Display duration - on(this.player.media, 'durationchange loadeddata loadedmetadata', function (event) { + on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', function (event) { return controls.durationUpdate.call(_this3.player, event); }); // Check for audio tracks on load // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point - on(this.player.media, 'loadeddata canplay', function () { + on.call(this.player, this.player.media, 'canplay', function () { toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio); toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio); }); // Handle the media finishing - on(this.player.media, 'ended', function () { + on.call(this.player, this.player.media, 'ended', function () { // Show poster on end if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) { // Restart @@ -4350,28 +4350,28 @@ var Listeners = function () { }); // Check for buffer progress - on(this.player.media, 'progress playing seeking seeked', function (event) { + on.call(this.player, this.player.media, 'progress playing seeking seeked', function (event) { return controls.updateProgress.call(_this3.player, event); }); // Handle volume changes - on(this.player.media, 'volumechange', function (event) { + on.call(this.player, this.player.media, 'volumechange', function (event) { return controls.updateVolume.call(_this3.player, event); }); // Handle play/pause - on(this.player.media, 'playing play pause ended emptied timeupdate', function (event) { + on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', function (event) { return ui.checkPlaying.call(_this3.player, event); }); // Loading state - on(this.player.media, 'waiting canplay seeked playing', function (event) { + on.call(this.player, this.player.media, 'waiting canplay seeked playing', function (event) { return ui.checkLoading.call(_this3.player, event); }); // If autoplay, then load advertisement if required // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows - on(this.player.media, 'playing', function () { + on.call(this.player, this.player.media, 'playing', function () { if (!_this3.player.ads) { return; } @@ -4398,7 +4398,7 @@ var Listeners = function () { } // On click play, pause ore restart - on(wrapper, 'click', function () { + on.call(this.player, wrapper, 'click', function () { // Touch devices will just show controls (if we're hiding controls) if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) { return; @@ -4417,19 +4417,19 @@ var Listeners = function () { // Disable right click if (this.player.supported.ui && this.player.config.disableContextMenu) { - on(this.player.elements.wrapper, 'contextmenu', function (event) { + on.call(this.player, this.player.elements.wrapper, 'contextmenu', function (event) { event.preventDefault(); }, false); } // Volume change - on(this.player.media, 'volumechange', function () { + on.call(this.player, this.player.media, 'volumechange', function () { // Save to storage _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted }); }); // Speed change - on(this.player.media, 'ratechange', function () { + on.call(this.player, this.player.media, 'ratechange', function () { // Update UI controls.updateSetting.call(_this3.player, 'speed'); @@ -4438,19 +4438,19 @@ var Listeners = function () { }); // Quality request - on(this.player.media, 'qualityrequested', function (event) { + on.call(this.player, this.player.media, 'qualityrequested', function (event) { // Save to storage _this3.player.storage.set({ quality: event.detail.quality }); }); // Quality change - on(this.player.media, 'qualitychange', function (event) { + on.call(this.player, this.player.media, 'qualitychange', function (event) { // Update UI controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality); }); // Caption language change - on(this.player.media, 'languagechange', function () { + on.call(this.player, this.player.media, 'languagechange', function () { // Update UI controls.updateSetting.call(_this3.player, 'captions'); @@ -4459,7 +4459,7 @@ var Listeners = function () { }); // Captions toggle - on(this.player.media, 'captionsenabled captionsdisabled', function () { + on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', function () { // Update UI controls.updateSetting.call(_this3.player, 'captions'); @@ -4469,7 +4469,7 @@ var Listeners = function () { // Proxy events to container // Bubble up key events for Edge - on(this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { + on.call(this.player, this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { var _event$detail = event.detail, detail = _event$detail === undefined ? {} : _event$detail; @@ -4479,7 +4479,7 @@ var Listeners = function () { detail = _this3.player.media.error; } - trigger.call(_this3.player, _this3.player.elements.container, event.type, true, detail); + triggerEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail); }); } @@ -4517,7 +4517,7 @@ var Listeners = function () { var customHandler = _this4.player.config.listeners[customHandlerKey]; var hasCustomHandler = is.function(customHandler); - on(element, type, function (event) { + on.call(_this4.player, element, type, function (event) { return proxy(event, defaultHandler, customHandlerKey); }, passive && !hasCustomHandler); }; @@ -4752,14 +4752,6 @@ var Listeners = function () { } }, 'volume', false); } - - // Reset on destroy - - }, { - key: 'clear', - value: function clear() { - this.global(false); - } }]); return Listeners; }(); @@ -5107,7 +5099,7 @@ function assurePlaybackState(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -5261,7 +5253,7 @@ var vimeo = { // Set seeking state and trigger event media.seeking = true; - trigger.call(player, media, 'seeking'); + triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete Promise.resolve(restorePause && embed.setVolume(0)) @@ -5291,7 +5283,7 @@ var vimeo = { set: function set(input) { player.embed.setPlaybackRate(input).then(function () { speed = input; - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }).catch(function (error) { // Hide menu item (and menu if empty) if (error.name === 'Error') { @@ -5311,7 +5303,7 @@ var vimeo = { set: function set(input) { player.embed.setVolume(input).then(function () { volume = input; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); } }); @@ -5328,7 +5320,7 @@ var vimeo = { player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () { muted = toggle; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); } }); @@ -5390,13 +5382,13 @@ var vimeo = { // Get current time player.embed.getCurrentTime().then(function (value) { currentTime = value; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); // Get duration player.embed.getDuration().then(function (value) { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); }); // Get captions @@ -5420,7 +5412,7 @@ var vimeo = { player.embed.getPaused().then(function (paused) { assurePlaybackState.call(player, !paused); if (!paused) { - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); } }); @@ -5435,7 +5427,7 @@ var vimeo = { player.embed.on('play', function () { assurePlaybackState.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); }); player.embed.on('pause', function () { @@ -5445,16 +5437,16 @@ var vimeo = { player.embed.on('timeupdate', function (data) { player.media.seeking = false; currentTime = data.seconds; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); player.embed.on('progress', function (data) { player.media.buffered = data.percent; - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); // Check all loaded if (parseInt(data.percent, 10) === 1) { - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } // Get duration as if we do it before load, it gives an incorrect value @@ -5462,24 +5454,24 @@ var vimeo = { player.embed.getDuration().then(function (value) { if (value !== player.media.duration) { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } }); }); player.embed.on('seeked', function () { player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); }); player.embed.on('ended', function () { player.media.paused = true; - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); }); player.embed.on('error', function (detail) { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }); // Rebuild UI @@ -5503,52 +5495,29 @@ function parseId$1(url) { // Standardise YouTube quality unit function mapQualityUnit(input) { - switch (input) { - case 'hd2160': - return 2160; - - case 2160: - return 'hd2160'; - - case 'hd1440': - return 1440; - - case 1440: - return 'hd1440'; - - case 'hd1080': - return 1080; - - case 1080: - return 'hd1080'; - - case 'hd720': - return 720; - - case 720: - return 'hd720'; - - case 'large': - return 480; - - case 480: - return 'large'; - - case 'medium': - return 360; - - case 360: - return 'medium'; - - case 'small': - return 240; + var qualities = { + hd2160: 2160, + hd1440: 1440, + hd1080: 1080, + hd720: 720, + large: 480, + medium: 360, + small: 240, + tiny: 144 + }; - case 240: - return 'small'; + var entry = Object.entries(qualities).find(function (entry) { + return entry.includes(input); + }); - default: - return 'default'; + if (entry) { + // Get the match corresponding to the input + return entry.find(function (value) { + return value !== input; + }); } + + return 'default'; } function mapQualityUnits(levels) { @@ -5568,7 +5537,7 @@ function assurePlaybackState$1(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -5756,10 +5725,10 @@ var youtube = { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }, onPlaybackQualityChange: function onPlaybackQualityChange() { - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: player.media.quality }); }, @@ -5770,7 +5739,7 @@ var youtube = { // Get current speed player.media.playbackRate = instance.getPlaybackRate(); - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }, onReady: function onReady(event) { // Get the instance @@ -5811,7 +5780,7 @@ var youtube = { // Set seeking state and trigger event player.media.seeking = true; - trigger.call(player, player.media, 'seeking'); + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent instance.seekTo(time); @@ -5834,15 +5803,7 @@ var youtube = { return mapQualityUnit(instance.getPlaybackQuality()); }, set: function set(input) { - var quality = input; - - // Set via API - instance.setPlaybackQuality(mapQualityUnit(quality)); - - // Trigger request event - trigger.call(player, player.media, 'qualityrequested', false, { - quality: quality - }); + instance.setPlaybackQuality(mapQualityUnit(input)); } }); @@ -5856,7 +5817,7 @@ var youtube = { set: function set(input) { volume = input; instance.setVolume(volume * 100); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); } }); @@ -5871,7 +5832,7 @@ var youtube = { var toggle = is.boolean(input) ? input : muted; muted = toggle; instance[toggle ? 'mute' : 'unMute'](); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); } }); @@ -5897,8 +5858,8 @@ var youtube = { player.media.setAttribute('tabindex', -1); } - trigger.call(player, player.media, 'timeupdate'); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer clearInterval(player.timers.buffering); @@ -5910,7 +5871,7 @@ var youtube = { // Trigger progress only when we actually buffer something if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); } // Set last buffer point @@ -5921,7 +5882,7 @@ var youtube = { clearInterval(player.timers.buffering); // Trigger event - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } }, 200); @@ -5942,7 +5903,7 @@ var youtube = { if (seeked) { // Unset seeking and fire seeked event player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); } // Handle events @@ -5955,11 +5916,11 @@ var youtube = { switch (event.data) { case -1: // Update scrubber - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube player.media.buffered = instance.getVideoLoadedFraction(); - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); break; @@ -5972,7 +5933,7 @@ var youtube = { instance.stopVideo(); instance.playVideo(); } else { - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); } break; @@ -5984,11 +5945,11 @@ var youtube = { } else { assurePlaybackState$1.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress player.timers.playing = setInterval(function () { - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }, 50); // Check duration again due to YouTube bug @@ -5996,7 +5957,7 @@ var youtube = { // https://code.google.com/p/gdata-issues/issues/detail?id=8690 if (player.media.duration !== instance.getDuration()) { player.media.duration = instance.getDuration(); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } // Get quality @@ -6018,7 +5979,7 @@ var youtube = { break; } - trigger.call(player, player.elements.container, 'statechange', false, { + triggerEvent.call(player, player.elements.container, 'statechange', false, { code: event.data }); } @@ -6375,7 +6336,7 @@ var Ads = function () { // Proxy event var dispatchEvent = function dispatchEvent(type) { var event = 'ads' + type.replace(/_/g, '').toLowerCase(); - trigger.call(_this7.player, _this7.player.media, event); + triggerEvent.call(_this7.player, _this7.player.media, event); }; switch (event.type) { @@ -6664,7 +6625,7 @@ var Ads = function () { }, { key: 'trigger', - value: function trigger$$1(event) { + value: function trigger(event) { var _this11 = this; for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { @@ -7051,7 +7012,7 @@ var Plyr = function () { this.elements.container.className = ''; // Get attributes from URL and set config - if (!url.searchParams) { + if (url.searchParams.length) { var truthy = ['1', 'true']; if (truthy.includes(url.searchParams.get('autoplay'))) { @@ -7126,6 +7087,8 @@ var Plyr = function () { return; } + this.eventListeners = []; + // Create listeners this.listeners = new Listeners(this); @@ -7152,7 +7115,7 @@ var Plyr = function () { // Listen for events if debugging if (this.config.debug) { - on(this.elements.container, this.config.events.join(' '), function (event) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { _this.debug.log('event: ' + event.type); }); } @@ -7351,7 +7314,7 @@ var Plyr = function () { // Update state and trigger event if (active !== this.captions.active) { this.captions.active = active; - trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); + triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); } } @@ -7401,7 +7364,7 @@ var Plyr = function () { // Trigger event on change if (hiding !== isHidden) { var eventName = hiding ? 'controlshidden' : 'controlsshown'; - trigger.call(this, this.media, eventName); + triggerEvent.call(this, this.media, eventName); } return !hiding; } @@ -7417,9 +7380,19 @@ var Plyr = function () { }, { key: 'on', value: function on$$1(event, callback) { - on(this.elements.container, event, callback); + on.call(this, this.elements.container, event, callback); } + /** + * Add event listeners once + * @param {string} event - Event type + * @param {function} callback - Callback for when event occurs + */ + }, { + key: 'once', + value: function once$$1(event, callback) { + once(this.elements.container, event, callback); + } /** * Remove event listeners * @param {string} event - Event type @@ -7480,13 +7453,13 @@ var Plyr = function () { } } else { // Unbind listeners - _this2.listeners.clear(); + unbindListeners.call(_this2); // Replace the container with the original element provided replaceElement(_this2.elements.original, _this2.elements.container); // Event - trigger.call(_this2, _this2.elements.original, 'destroyed', true); + triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true); // Callback if (is.function(callback)) { @@ -7878,36 +7851,26 @@ var Plyr = function () { }, { key: 'quality', set: function set$$1(input) { - var quality = null; + var config = this.config.quality; + var options = this.options.quality; - if (!is.empty(input)) { - quality = Number(input); - } - - if (!is.number(quality)) { - quality = this.storage.get('quality'); - } - - if (!is.number(quality)) { - quality = this.config.quality.selected; - } - - if (!is.number(quality)) { - quality = this.config.quality.default; - } - - if (!this.options.quality.length) { + if (!options.length) { return; } - if (!this.options.quality.includes(quality)) { - var value = closest(this.options.quality, quality); + var quality = [!is.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is.number); + + if (!options.includes(quality)) { + var value = closest(options, quality); this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead'); quality = value; } + // Trigger request event + triggerEvent.call(this, this.media, 'qualityrequested', false, { quality: quality }); + // Update config - this.config.quality.selected = quality; + config.selected = quality; // Set quality this.media.quality = quality; @@ -8136,8 +8099,8 @@ var Plyr = function () { }, { key: 'loadSprite', - value: function loadSprite(url, id) { - return loadScript(url, id); + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); } /** diff --git a/dist/plyr.js.map b/dist/plyr.js.map index 8fec6f6f..bf3d73ee 100644 --- a/dist/plyr.js.map +++ b/dist/plyr.js.map @@ -1 +1 @@ -{"version":3,"sources":["utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","utils/arrays.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","passive","capture","empty","function","from","forEach","element","Node","call","events","split","type","on","off","trigger","bubbles","detail","CustomEvent","assign","dispatchEvent","wrap","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","key","value","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","toggleState","pressed","getAttribute","state","transitionEndEvent","find","style","undefined","repaint","offsetHeight","browser","documentMode","documentElement","navigator","userAgent","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","range","matchMedia","dedupe","filter","item","indexOf","closest","reduce","prev","curr","Math","abs","html5","sources","getSources","sizes","source","map","player","mime","currentTime","playing","src","onLoadedMetaData","load","play","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","obj","extend","shift","generateId","prefix","floor","random","format","args","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","storage","store","localStorage","getItem","json","get","setItem","removeItem","loadSprite","url","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","push","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","bind","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","props","create","findElements","labels","join","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","meta","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","changed","caption","defaults","providers","types","getProviderByUrl","youtube","vimeo","noop","Console","console","onChange","isIos","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","step","direction","deltaY","deltaX","define","this","loadScript","parseId","regex","$2","getAspectRatio","getRatio","w","h","ratio","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","urls","sdk","padding","paddingBottom","offset","transform","autoplay","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","build","mapQualityUnit","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","apply","Date","now","base","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","change","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, false, passive, capture);\n}\n\n// Trigger event\nexport function trigger(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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport { removeElement } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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());\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (is.array(options)) {\n this.options.quality = 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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.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(container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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(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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n trigger.call(this, this.media, 'languagechange');\n }\n\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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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 trigger.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n on(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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 trigger.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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, toggleListener, trigger } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on(this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on(this.player.media, 'loadeddata canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n trigger.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n trigger.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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n trigger.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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 trigger.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n trigger.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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n trigger.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n trigger.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n trigger.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n trigger.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n trigger.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 trigger.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n trigger.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n trigger.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n trigger.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n trigger.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n trigger.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n trigger.call(player, player.media, 'timeupdate');\n trigger.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n trigger.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n trigger.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n trigger.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n trigger.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n trigger.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n trigger.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n trigger.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n trigger.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n trigger.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n trigger.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, trigger } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadScript';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (!url.searchParams) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!is.empty(input)) {\n quality = Number(input);\n }\n\n if (!is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const value = closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n trigger.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n trigger.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file +{"version":3,"sources":["utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","utils/arrays.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","passive","capture","once","empty","function","from","forEach","element","Node","call","events","split","eventListeners","push","type","on","off","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","dispatchEvent","unbindListeners","item","wrap","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","key","value","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","toggleState","pressed","getAttribute","state","transitionEndEvent","find","style","undefined","repaint","offsetHeight","browser","documentMode","documentElement","navigator","userAgent","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","range","matchMedia","html5","sources","filter","mime","source","getSources","map","player","currentTime","playing","src","onLoadedMetaData","load","play","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","reduce","obj","extend","shift","generateId","prefix","Math","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","dedupe","indexOf","closest","prev","curr","abs","Storage","enabled","storage","store","localStorage","getItem","json","get","setItem","removeItem","loadSprite","url","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","bind","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","props","create","findElements","labels","join","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","meta","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","changed","caption","defaults","providers","types","getProviderByUrl","youtube","vimeo","noop","Console","console","onChange","isIos","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","step","direction","deltaY","deltaX","define","this","loadScript","parseId","regex","$2","getAspectRatio","getRatio","w","h","ratio","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","urls","sdk","padding","paddingBottom","offset","transform","autoplay","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","build","mapQualityUnit","qualities","entry","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","Date","now","base","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","change","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 && !once) {\n // Cache event listener\n this.eventListeners.push({ elements, type, callback, options });\n }\n\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport 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\nexport 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\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener(element, events, onceCallback, true, passive, capture, true);\n}\n\n// Trigger event\nexport 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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { elements, type, callback, options } = item;\n elements.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\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.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { once } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n };\n\n // Listen for the transition finishing and restore auto height/width\n once(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\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 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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\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 onChange.call(this);\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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on.call(this.player, this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on.call(this.player, this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(this.player, element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = 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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\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\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\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\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 setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n triggerEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = ([\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ]).find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once(this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file diff --git a/dist/plyr.min.js b/dist/plyr.min.js index a004b5bb..38d496d5 100644 --- a/dist/plyr.min.js +++ b/dist/plyr.min.js @@ -1,2 +1,2 @@ -"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e=function(e){return null!=e?e.constructor:null},t=function(e,t){return Boolean(e&&t&&e instanceof t)},i={object:function(t){return e(t)===Object},number:function(t){return e(t)===Number&&!Number.isNaN(t)},string:function(t){return e(t)===String},boolean:function(t){return e(t)===Boolean},function:function(t){return e(t)===Function},array:function(e){return!i.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return t(e,WeakMap)},nodeList:function(e){return t(e,NodeList)},element:function(e){return t(e,Element)},textNode:function(t){return e(t)===Text},event:function(e){return t(e,Event)},cue:function(e){return t(e,window.TextTrackCue)||t(e,window.VTTCue)},track:function(e){return t(e,TextTrack)||!i.nullOrUndefined(e)&&i.string(e.kind)},url:function(e){return!i.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return i.nullOrUndefined(e)||(i.string(e)||i.array(e)||i.nodeList(e))&&!e.length||i.object(e)&&!Object.keys(e).length}},n=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function a(e,t,s){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(!i.empty(e)&&!i.empty(t)&&i.function(s))if(i.nodeList(e)||i.array(e))Array.from(e).forEach(function(e){e instanceof Node&&a.call(null,e,t,s,r,l,o)});else{var c=t.split(" "),u=o;n&&(u={passive:l,capture:o}),c.forEach(function(t){e[r?"addEventListener":"removeEventListener"](t,s,u)})}}function s(e){a(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",arguments[2],!0,!(arguments.length>3&&void 0!==arguments[3])||arguments[3],arguments.length>4&&void 0!==arguments[4]&&arguments[4])}function r(e){a(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",arguments[2],!1,!(arguments.length>3&&void 0!==arguments[3])||arguments[3],arguments.length>4&&void 0!==arguments[4]&&arguments[4])}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i.element(e)&&!i.empty(t)){var s=new CustomEvent(t,{bubbles:n,detail:Object.assign({},a,{plyr:this})});e.dispatchEvent(s)}}var o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},c=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),u=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},d=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var i=[],n=!0,a=!1,s=void 0;try{for(var r,l=e[Symbol.iterator]();!(n=(r=l.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){a=!0,s=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw s}}return i}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function p(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;n.appendChild(e),s?a.insertBefore(n,s):a.appendChild(n)})}function h(e,t){i.element(e)&&!i.empty(t)&&Object.entries(t).forEach(function(t){var i=d(t,2),n=i[0],a=i[1];e.setAttribute(n,a)})}function m(e,t,n){var a=document.createElement(e);return i.object(t)&&h(a,t),i.string(n)&&(a.innerText=n),a}function f(e,t,i,n){t.appendChild(m(e,i,n))}function g(e){i.nodeList(e)||i.array(e)?Array.from(e).forEach(g):i.element(e)&&i.element(e.parentNode)&&e.parentNode.removeChild(e)}function y(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function v(e,t){return i.element(t)&&i.element(t.parentNode)&&i.element(e)?(t.parentNode.replaceChild(e,t),e):null}function b(e,t){if(!i.string(e)||i.empty(e))return{};var n={},a=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),r=t.replace(/[[\]]/g,"").split("="),l=r[0],o=r.length>1?r[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":i.object(a)&&i.string(a.class)&&(a.class+=" "+s),n.class=s;break;case"#":n.id=t.replace("#","");break;case"[":n[l]=o}}),n}function k(e,t){if(i.element(e)){var n=t;i.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function w(e,t,n){if(i.element(e)){var a="toggle";return void 0!==n&&(a=n?"add":"remove"),e.classList[a](t),e.classList.contains(t)}return null}function T(e,t){return i.element(e)&&e.classList.contains(t)}function A(e,t){var i={Element:Element};return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function C(e){return this.elements.container.querySelectorAll(e)}function E(e){return this.elements.container.querySelector(e)}function P(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}function S(e,t){if(i.array(e)||i.nodeList(e))Array.from(e).forEach(function(e){return S(e,t)});else if(i.element(e)){var n="true"===e.getAttribute("aria-pressed"),a=i.boolean(t)?t:!n;e.setAttribute("aria-pressed",a)}}var N,L,x,M=(N=document.createElement("span"),L={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},x=Object.keys(L).find(function(e){return void 0!==N.style[e]}),!!i.string(x)&&L[x]);var _,q={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},I={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=!1,a=!1,s=q.isIPhone&&i&&I.playsinline;switch(t+":"+e){case"html5:video":a=(n=I.video)&&I.rangeInput&&(!q.isIPhone||s);break;case"html5:audio":a=(n=I.audio)&&I.rangeInput;break;case"youtube:video":case"vimeo:video":n=!0,a=I.rangeInput&&(!q.isIPhone||s);break;default:a=(n=I.audio&&I.video)&&I.rangeInput}return{api:n,ui:a}},pip:!q.isIPhone&&i.function(m("video").webkitSetPresentationMode),airplay:i.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!i.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),rangeInput:(_=document.createElement("input"),_.type="range","range"===_.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==M,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};function j(e){return i.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e}var O={getSources:function(){return this.isHTML5?this.media.querySelectorAll("source"):null},getQualityOptions:function(){if(!this.isHTML5)return null;var e=O.getSources.call(this);if(i.empty(e))return null;var t=Array.from(e).filter(function(e){return!i.empty(e.getAttribute("size"))});return i.empty(t)?null:j(t.map(function(e){return Number(e.getAttribute("size"))}))},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=O.getSources.call(e);if(i.empty(t))return null;var n=Array.from(t).filter(function(t){return t.getAttribute("src")===e.source});return i.empty(n)?null:Number(n[0].getAttribute("size"))},set:function(t){var n=O.getSources.call(e);if(!i.empty(n)){var a=Array.from(n).filter(function(e){return Number(e.getAttribute("size"))===t});if(!i.empty(a)){var s=a.filter(function(t){return I.mime.call(e,t.getAttribute("type"))});if(!i.empty(s)){l.call(e,e.media,"qualityrequested",!1,{quality:t});var r=e.currentTime,o=e.playing;e.media.src=s[0].getAttribute("src");e.on("loadedmetadata",function t(){e.currentTime=r,e.off("loadedmetadata",t)}),e.media.load(),o&&e.play(),l.call(e,e.media,"qualitychange",!1,{quality:t})}}}}})}},cancelRequests:function(){this.isHTML5&&(g(O.getSources()),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function R(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var s=n.shift();return i.object(s)?(Object.keys(s).forEach(function(t){i.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,u({},t,{})),R(e[t],s[t])):Object.assign(e,u({},t,s[t]))}),R.apply(void 0,[e].concat(n))):e}function V(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];return i.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return i.string(n[t])?n[t]:""})}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())}function D(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function B(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=H(e,"-"," "),e=H(e,"_"," "),H(e=D(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function F(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var U=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i.empty(e)||i.empty(t))return"";var n,a=(n=t.i18n,e.split(".").reduce(function(e,t){return e&&e[t]},n));if(i.empty(a))return"";var s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach(function(e){var t=d(e,2),i=t[0],n=t[1];a=H(a,i,n)}),a},z=function(){function e(t){o(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return c(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(i.empty(n))return null;var a=JSON.parse(n);return i.string(t)&&t.length?a[t]:a}},{key:"set",value:function(t){if(e.supported&&this.enabled&&i.object(t)){var n=this.get();i.empty(n)&&(n={}),R(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();var W=function(e){return parseInt(e/60/60%60,10)},K=function(e){return parseInt(e/60%60,10)},Y=function(e){return parseInt(e%60,10)};function Q(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!i.number(e))return Q(null,t,n);var a=function(e){return("0"+e).slice(-2)},s=W(e),r=K(e),l=Y(e);return t||s>0?s+=":":s="",(n?"-":"")+s+a(r)+":"+a(l)}var J={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||q.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=E.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:C.call(this,this.config.selectors.buttons.play),pause:E.call(this,this.config.selectors.buttons.pause),restart:E.call(this,this.config.selectors.buttons.restart),rewind:E.call(this,this.config.selectors.buttons.rewind),fastForward:E.call(this,this.config.selectors.buttons.fastForward),mute:E.call(this,this.config.selectors.buttons.mute),pip:E.call(this,this.config.selectors.buttons.pip),airplay:E.call(this,this.config.selectors.buttons.airplay),settings:E.call(this,this.config.selectors.buttons.settings),captions:E.call(this,this.config.selectors.buttons.captions),fullscreen:E.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=E.call(this,this.config.selectors.progress),this.elements.inputs={seek:E.call(this,this.config.selectors.inputs.seek),volume:E.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:E.call(this,this.config.selectors.display.buffer),currentTime:E.call(this,this.config.selectors.display.currentTime),duration:E.call(this,this.config.selectors.display.duration)},i.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=J.getIconUrl.call(this),n=(i.cors?"":i.url)+"#"+this.config.iconPrefix,a=document.createElementNS("http://www.w3.org/2000/svg","svg");h(a,R(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),r=n+"-"+e;return"href"in s?s.setAttributeNS("http://www.w3.org/1999/xlink","href",r):s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),a.appendChild(s),a},createLabel:function(e,t){var i=U(e,this.config),n=Object.assign({},t);switch(e){case"pip":i="PIP";break;case"airplay":i="AirPlay"}return"class"in n?n.class+=" "+this.config.classNames.hidden:n.class=this.config.classNames.hidden,m("span",n,i)},createBadge:function(e){if(i.empty(e))return null;var t=m("span",{class:this.config.classNames.menu.value});return t.appendChild(m("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=m("button"),a=Object.assign({},t),s=B(e),r=!1,l=void 0,o=void 0,c=void 0,u=void 0;switch("type"in a||(a.type="button"),"class"in a?a.class.includes(this.config.classNames.control)&&(a.class+=" "+this.config.classNames.control):a.class=this.config.classNames.control,e){case"play":r=!0,l="play",c="pause",o="play",u="pause";break;case"mute":r=!0,l="mute",c="unmute",o="volume",u="muted";break;case"captions":r=!0,l="enableCaptions",c="disableCaptions",o="captions-off",u="captions-on";break;case"fullscreen":r=!0,l="enterFullscreen",c="exitFullscreen",o="enter-fullscreen",u="exit-fullscreen";break;case"play-large":a.class+=" "+this.config.classNames.control+"--overlaid",s="play",l="play",o="play";break;default:l=s,o=e}return r?(n.appendChild(J.createIcon.call(this,u,{class:"icon--pressed"})),n.appendChild(J.createIcon.call(this,o,{class:"icon--not-pressed"})),n.appendChild(J.createLabel.call(this,c,{class:"label--pressed"})),n.appendChild(J.createLabel.call(this,l,{class:"label--not-pressed"})),a["aria-pressed"]=!1):(n.appendChild(J.createIcon.call(this,o)),n.appendChild(J.createLabel.call(this,l))),R(a,b(this.config.selectors.buttons[s],a)),h(n,a),"play"===s?(i.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(n)):this.elements.buttons[s]=n,n},createRange:function(e,t){var i=m("label",{for:t.id,id:t.id+"-label",class:this.config.classNames.hidden},U(e,this.config)),n=m("input",R(b(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-labelledby":t.id+"-label","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,J.updateRangeFill.call(this,n),{label:i,input:n}},createProgress:function(e,t){var i=m("progress",R(b(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){i.appendChild(m("span",null,"0"));var n="";switch(e){case"played":n=U("played",this.config);break;case"buffer":n=U("buffered",this.config)}i.innerText="% "+n.toLowerCase()}return this.elements.display[e]=i,i},createTime:function(e){var t=b(this.config.selectors.display[e]),i=m("div",R(t,{class:"plyr__time "+t.class,"aria-label":U(e,this.config)}),"00:00");return this.elements.display[e]=i,i},createMenuItem:function(e){var t=e.value,n=e.list,a=e.type,s=e.title,r=e.badge,l=void 0===r?null:r,o=e.checked,c=void 0!==o&&o,u=m("li"),d=m("label",{class:this.config.classNames.control}),p=m("input",R(b(this.config.selectors.inputs[a]),{type:"radio",name:"plyr-"+a,value:t,checked:c,class:"plyr__sr-only"})),h=m("span",{hidden:""});d.appendChild(p),d.appendChild(h),d.insertAdjacentHTML("beforeend",s),i.element(l)&&d.appendChild(l),u.appendChild(d),n.appendChild(u)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(i.element(e)&&i.number(t)){var a=W(this.duration)>0;e.innerText=Q(t,a,n)}},updateVolume:function(){this.supported.ui&&(i.element(this.elements.inputs.volume)&&J.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),i.element(this.elements.buttons.mute)&&S(this.elements.buttons.mute,this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;i.element(e)&&(e.value=t,J.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&i.event(e)){var n,a,s=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,a=this.duration,s=0===n||0===a||Number.isNaN(n)||Number.isNaN(a)?0:(n/a*100).toFixed(2),"timeupdate"===e.type&&J.setRange.call(this,this.elements.inputs.seek,s);break;case"playing":case"progress":!function(e,n){var a=i.number(n)?n:0,s=i.element(e)?e:t.elements.display.buffer;if(i.element(s)){s.value=a;var r=s.getElementsByTagName("span")[0];i.element(r)&&(r.childNodes[0].nodeValue=a)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=i.event(e)?e.target:e;i.element(t)&&"range"===t.getAttribute("type")&&(t.setAttribute("aria-valuenow",t.value),q.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%"))},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&i.element(this.elements.inputs.seek)&&i.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,a=this.elements.progress.getBoundingClientRect(),s=this.config.classNames.tooltip+"--visible",r=function(e){w(t.elements.display.seekTooltip,s,e)};if(this.touch)r(!1);else{if(i.event(e))n=100/a.width*(e.pageX-a.left);else{if(!T(this.elements.display.seekTooltip,s))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),J.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",i.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!i.element(this.elements.display.duration)&&this.config.invertTime;J.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||J.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){var e=i.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&J.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&J.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),J.updateSeekTooltip.call(this)}},toggleTab:function(e,t){k(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(i.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");i.array(e)&&(this.options.quality=e.filter(function(e){return t.config.quality.options.includes(e)}));var a=!i.empty(this.options.quality)&&this.options.quality.length>1;if(J.toggleTab.call(this,"quality",a),J.checkMenu.call(this),a){y(n);this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){J.createMenuItem.call(t,{value:e,list:n,type:"quality",title:J.getLabel.call(t,"quality",e),badge:function(e){var i=U("qualityBadge."+e,t.config);return i.length?J.createBadge.call(t,i):null}(e)})}),J.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?U("normal",this.config):t+"×";case"quality":if(i.number(t)){var n=U("qualityLabel."+t,this.config);return n.length?n:t+"p"}return D(t);case"captions":return Z.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var a=this.elements.settings.panes[e],s=null,r=t;switch(e){case"captions":s=this.currentTrack;break;default:if(s=i.empty(n)?this[e]:n,i.empty(s)&&(s=this.config[e].default),!i.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '"+s+"' for "+e);if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '"+s+"' for "+e)}if(i.element(r)||(r=a&&a.querySelector("ul")),i.element(r)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=J.getLabel.call(this,e,s);var l=r&&r.querySelector('input[value="'+s+'"]');i.element(l)&&(l.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),i=Z.getTracks.call(this);if(J.toggleTab.call(this,"captions",i.length),y(t),J.checkMenu.call(this),i.length){var n=i.map(function(i,n){return{value:n,checked:e.captions.active&&e.currentTrack===n,title:Z.getLabel.call(e,i),badge:i.language&&J.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});n.unshift({value:-1,checked:!this.captions.active,title:U("disabled",this.config),list:t,type:"language"}),n.forEach(J.createMenuItem.bind(this)),J.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&i.element(this.elements.settings.panes.speed)){i.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!i.empty(this.options.speed)&&this.options.speed.length>1;if(J.toggleTab.call(this,"speed",n),J.checkMenu.call(this),n){var a=this.elements.settings.panes.speed.querySelector("ul");y(a),this.options.speed.forEach(function(e){J.createMenuItem.call(t,{value:e,list:a,type:"speed",title:J.getLabel.call(t,"speed",e)})}),J.updateSetting.call(this,"speed",a)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!i.empty(e)&&Object.values(e).some(function(e){return!e.hidden});k(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(i.element(t)&&i.element(n)){var a=i.boolean(e)?e:i.element(t)&&t.hasAttribute("hidden");if(i.event(e)){var s=i.element(t)&&t.contains(e.target),r=e.target===this.elements.buttons.settings;if(s||!s&&!r&&a)return;r&&e.stopPropagation()}i.element(n)&&n.setAttribute("aria-expanded",a),i.element(t)&&(k(t,!a),w(this.elements.container,this.config.classNames.menu.open,a),a?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return g(t),{width:i,height:n}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,n=document.getElementById(e);if(i.element(n)&&"tabpanel"===n.getAttribute("role")){var a=t.querySelector('[role="tabpanel"]:not([hidden])'),l=a.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+a.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),I.transitions&&!I.reducedMotion){l.style.width=a.scrollWidth+"px",l.style.height=a.scrollHeight+"px";var o=J.getTabSize.call(this,n);s(l,M,function e(t){t.target===l&&["width","height"].includes(t.propertyName)&&(l.style.width="",l.style.height="",r(l,M,e))}),l.style.width=o.width+"px",l.style.height=o.height+"px"}k(a,!0),a.setAttribute("tabindex",-1),k(n,!1);var c=C.call(this,'[aria-controls="'+e+'"]');Array.from(c).forEach(function(e){e.setAttribute("aria-expanded",!0)}),n.removeAttribute("tabindex"),n.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(i.empty(this.config.controls))return null;var n=m("div",b(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(J.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(J.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(J.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(J.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var a=m("div",b(this.config.selectors.progress)),s=J.createRange.call(this,"seek",{id:"plyr-seek-"+e.id});if(a.appendChild(s.label),a.appendChild(s.input),a.appendChild(J.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=m("span",{class:this.config.classNames.tooltip},"00:00");a.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=a,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(J.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(J.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(J.createButton.call(this,"mute")),this.config.controls.includes("volume")){var l=m("div",{class:"plyr__volume"}),o={max:1,step:.05,value:this.config.volume},c=J.createRange.call(this,"volume",R(o,{id:"plyr-volume-"+e.id}));l.appendChild(c.label),l.appendChild(c.input),this.elements.volume=l,n.appendChild(l)}if(this.config.controls.includes("captions")&&n.appendChild(J.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!i.empty(this.config.settings)){var u=m("div",{class:"plyr__menu",hidden:""});u.appendChild(J.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var d=m("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),p=m("div"),h=m("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),f=m("ul",{role:"tablist"});this.config.settings.forEach(function(i){var n=m("li",{role:"tab",hidden:""}),a=m("button",R(b(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+i+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+i,"aria-expanded":!1}),U(i,t.config)),s=m("span",{class:t.config.classNames.menu.value});s.innerHTML=e[i],a.appendChild(s),n.appendChild(a),f.appendChild(n),t.elements.settings.tabs[i]=n}),h.appendChild(f),p.appendChild(h),this.config.settings.forEach(function(i){var n=m("div",{id:"plyr-settings-"+e.id+"-"+i,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+i+"-tab",role:"tabpanel",tabindex:-1}),a=m("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},U(i,t.config));n.appendChild(a);var s=m("ul");n.appendChild(s),p.appendChild(n),t.elements.settings.panes[i]=n}),d.appendChild(p),u.appendChild(d),n.appendChild(u),this.elements.settings.form=d,this.elements.settings.menu=u}return this.config.controls.includes("pip")&&I.pip&&n.appendChild(J.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&I.airplay&&n.appendChild(J.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(J.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(J.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&J.setQualityMenu.call(this,O.getQualityOptions.call(this)),J.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=J.getIconUrl.call(this);t.cors&&function(e,t){if(i.string(e)){var n=i.string(t),a=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,n&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!a()){var r=z.supported,l=document.createElement("div");if(l.setAttribute("hidden",""),n&&l.setAttribute("id",t),r){var o=window.localStorage.getItem("cache-"+t);if(null!==o){var c=JSON.parse(o);s(l,c.content)}}fetch(e).then(function(e){i.empty(e)||(r&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),s(l,e))}).catch(function(){})}}}(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var a={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;i.string(this.config.controls)||i.element(this.config.controls)?n=this.config.controls:i.function(this.config.controls)?n=this.config.controls.call(this,a):(n=J.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Z.getLabel.call(this)}),s=!1);var r=function(e){var t=e;return Object.entries(a).forEach(function(e){var i=d(e,2),n=i[0],a=i[1];t=H(t,"{"+n+"}",a)}),t};s&&(i.string(this.config.controls)?n=r(n):i.element(n)&&(n.innerHTML=r(n.innerHTML)));var l,o=void 0;if(i.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),i.element(o)||(o=this.elements.container),i.element(n)?o.appendChild(n):n&&o.insertAdjacentHTML("beforeend",n),i.element(this.elements.controls)||J.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(l=o,setTimeout(function(){k(l,!0),l.offsetHeight,k(l,!1)},0)),this.config.tooltips.controls){var c=C.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(c).forEach(function(t){w(t,e.config.classNames.hidden,!1),w(t,e.config.classNames.tooltip,!0),t.setAttribute("role","tooltip")})}}};function $(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(a.responseText))}catch(e){i(a.responseText)}else i(a.response)}),a.addEventListener("error",function(){throw new Error(a.statusText)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){n(e)}})}function X(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var i=document.createElement("a");i.href=t,t=i.href}try{return new URL(t)}catch(e){return null}}function G(e){if(!i.object(e))return"";var t=new URLSearchParams;return Object.entries(e).forEach(function(e){var i=d(e,2),n=i[0],a=i[1];t.set(n,a)}),t}var Z={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!I.textTracks)i.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&J.setCaptionsMenu.call(this);else{var e,t;if(i.element(this.elements.captions)||(this.elements.captions=m("div",b(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),q.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),i=X(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&$(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){g(e)})})}var a=this.storage.get("captions");i.boolean(a)||(a=this.config.captions.active);var r=this.storage.get("language")||this.config.captions.language;if("auto"===r){var l=(navigator.language||navigator.userLanguage).split("-");r=d(l,1)[0]}if(Z.setLanguage.call(this,r,a),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";s(this.media.textTracks,o,Z.update.bind(this))}setTimeout(Z.update.bind(this),0)}},update:function(){var e=this,t=Z.getTracks.call(this,!0),n=this.captions,a=n.language,r=n.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!r.get(e)}).forEach(function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),t.mode="hidden",s(t,"cuechange",function(){return Z.updateCues.call(e)})});var l=!t.find(function(t){return t===e.captions.currentTrackNode}),o=this.language!==a&&t.find(function(e){return e.language===a});(l||o)&&Z.setLanguage.call(this,a,this.config.captions.active),w(this.elements.container,this.config.classNames.captions.enabled,!i.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&J.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=Z.getTracks.call(this);if(-1!==e)if(i.number(e))if(e in a){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var s=Z.getCurrentTrack.call(this),r=(s||{}).language;this.captions.currentTrackNode=s,t&&(this.captions.language=r),this.isVimeo&&this.embed.enableTextTrack(r),l.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&Z.updateCues.call(this),n&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(i.string(e)){this.captions.language=e.toLowerCase();var n=Z.getTracks.call(this),a=Z.getCurrentTrack.call(this,!0);Z.set.call(this,n.indexOf(a),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=Z.getTracks.call(this),n=function(t){return Number((e.captions.meta.get(t)||{}).default)},a=Array.from(i).sort(function(e,t){return n(t)-n(e)});return!t&&i[this.currentTrack]||a.find(function(t){return t.language===e.captions.language})||a[0]},getLabel:function(e){var t=e;return!i.track(t)&&I.textTracks&&this.captions.active&&(t=Z.getCurrentTrack.call(this)),i.track(t)?i.empty(t.label)?i.empty(t.language)?U("enabled",this.config):e.language.toUpperCase():t.label:U("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(i.element(this.elements.captions))if(i.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Z.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(F)}var a=t.map(function(e){return e.trim()}).join("\n");if(a!==this.elements.captions.innerHTML){y(this.elements.captions);var s=m("span",b(this.config.selectors.caption));s.innerHTML=a,this.elements.captions.appendChild(s),l.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},ee={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},te={html5:"html5",youtube:"youtube",vimeo:"vimeo"},ie={audio:"audio",video:"video"};var ne=function(){},ae=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];o(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return c(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):ne}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):ne}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):ne}}]),e}();function se(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;i.element(e)&&S(e,this.active),l.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),q.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(i.element(e)){var n=C.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),a=n[0],l=n[n.length-1],o=function(e){if("Tab"===e.key&&9===e.keyCode){var t=P();t!==l||e.shiftKey?t===a&&e.shiftKey&&(l.focus(),e.preventDefault()):(a.focus(),e.preventDefault())}};t?s(this.elements.container,"keydown",o,!1):r(this.elements.container,"keydown",o,!1)}}.call(this.player,this.target,this.active)}}function re(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",w(this.target,this.player.config.classNames.fullscreen.fallback,e),se.call(this)}var le=function(){function e(t){var n=this;o(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},s(document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){se.call(n)}),s(this.player.elements.container,"dblclick",function(e){i.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return c(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),w(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(q.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?i.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():re.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(q.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!i.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else re.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:T(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return q.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(i.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!i.function(document[t+"ExitFullscreen"])&&!i.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function oe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?i:n)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var ce={addStyleHook:function(){w(this.elements.container,this.config.selectors.container.replace(".",""),!0),w(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void ce.toggleNativeControls.call(this,!0);i.element(this.elements.controls)||(J.inject.call(this),this.listeners.controls()),ce.toggleNativeControls.call(this),this.isHTML5&&Z.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,J.updateVolume.call(this),J.timeUpdate.call(this),ce.checkPlaying.call(this),w(this.elements.container,this.config.classNames.pip.supported,I.pip&&this.isHTML5&&this.isVideo),w(this.elements.container,this.config.classNames.airplay.supported,I.airplay&&this.isHTML5),w(this.elements.container,this.config.classNames.isIos,q.isIos),w(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){l.call(e,e.media,"ready")},0),ce.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&ce.setPoster.call(this,this.poster),this.config.duration&&J.durationUpdate.call(this)},setTitle:function(){var e=U("play",this.config);if(i.string(this.config.title)&&!i.empty(this.config.title)&&(e+=", "+this.config.title,this.elements.container.setAttribute("aria-label",this.config.title)),i.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=E.call(this,"iframe");if(!i.element(t))return;var n=i.empty(this.config.title)?"video":this.config.title,a=U("frameTitle",this.config);t.setAttribute("title",a.replace("{title}",n))}},togglePoster:function(e){w(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!i.element(this.elements.poster))return Promise.reject();var n=oe(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),ce.togglePoster.call(t,!0),e});return n.catch(function(){return ce.togglePoster.call(t,!1)}),n},checkPlaying:function(e){w(this.elements.container,this.config.classNames.playing,this.playing),w(this.elements.container,this.config.classNames.paused,this.paused),w(this.elements.container,this.config.classNames.stopped,this.stopped),S(this.elements.buttons.play,this.playing),i.event(e)&&"timeupdate"===e.type||ce.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){w(t.elements.container,t.config.classNames.loading,t.loading),ce.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},ue=function(){function e(t){o(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return c(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&i.number(n)){if(a){var r=P();if(i.element(r)&&r!==this.player.elements.inputs.seek&&A(r,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:s||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:s||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:s||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){J.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,w(this.player.elements.container,this.player.config.classNames.isTouch,!0),r(document.body,"touchstart",this.firstTouch)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&a(window,"keydown keyup",this.handleKey,e,!1),a(document.body,"click",this.toggleMenu,e),s(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&s(this.player.elements.container,"keydown keyup",this.handleKey,!1),s(this.player.elements.container,"focusout",function(t){w(t.target,e.player.config.classNames.tabFocus,!1)}),s(this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){w(P(),e.player.config.classNames.tabFocus,!0)},0)}),s(this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var i=e.player.elements.controls;"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var n=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ce.toggleControls.call(e.player,!0),n=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return ce.toggleControls.call(e.player,!1)},n)})}},{key:"media",value:function(){var e=this;if(s(this.player.media,"timeupdate seeking seeked",function(t){return J.timeUpdate.call(e.player,t)}),s(this.player.media,"durationchange loadeddata loadedmetadata",function(t){return J.durationUpdate.call(e.player,t)}),s(this.player.media,"loadeddata canplay",function(){k(e.player.elements.volume,!e.player.hasAudio),k(e.player.elements.buttons.mute,!e.player.hasAudio)}),s(this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),s(this.player.media,"progress playing seeking seeked",function(t){return J.updateProgress.call(e.player,t)}),s(this.player.media,"volumechange",function(t){return J.updateVolume.call(e.player,t)}),s(this.player.media,"playing play pause ended emptied timeupdate",function(t){return ce.checkPlaying.call(e.player,t)}),s(this.player.media,"waiting canplay seeked playing",function(t){return ce.checkLoading.call(e.player,t)}),s(this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=E.call(this.player,"."+this.player.config.classNames.video);if(!i.element(t))return;s(t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&s(this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),s(this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),s(this.player.media,"ratechange",function(){J.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),s(this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),s(this.player.media,"qualitychange",function(t){J.updateSetting.call(e.player,"quality",null,t.detail.quality)}),s(this.player.media,"languagechange",function(){J.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),s(this.player.media,"captionsenabled captionsdisabled",function(){J.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),s(this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var i=t.detail,n=void 0===i?{}:i;"error"===t.type&&(n=e.player.media.error),l.call(e.player,e.player.elements.container,t.type,!0,n)})}},{key:"controls",value:function(){var e=this,t=q.isIE?"change":"input",n=function(t,n,a){var s=e.player.config.listeners[a],r=!0;i.function(s)&&(r=s.call(e.player,t)),r&&i.function(n)&&n.call(e.player,t)},a=function(t,a,r,l){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],c=e.player.config.listeners[l],u=i.function(c);s(t,a,function(e){return n(e,r,l)},o&&!u)};a(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),a(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),a(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),a(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),a(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),a(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),a(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),a(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),a(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),a(this.player.elements.buttons.settings,"click",function(t){J.toggleMenu.call(e.player,t)}),a(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";J.showTab.call(e.player,t)};if(A(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(A(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(A(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var a=t.target;J.showTab.call(e.player,a.getAttribute("aria-controls"))}}),a(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var i=e.player.elements.progress.getBoundingClientRect(),n=100/i.width*(t.pageX-i.left);t.currentTarget.setAttribute("seek-value",n)}),a(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var i=t.currentTarget,n=t.keyCode?t.keyCode:t.which,a=t.type;if("keydown"!==a&&"keyup"!==a||39===n||37===n){var s=i.hasAttribute("play-on-seeked"),r=["mouseup","touchend","keyup"].includes(t.type);s&&r?(i.removeAttribute("play-on-seeked"),e.player.play()):!r&&e.player.playing&&(i.setAttribute("play-on-seeked",""),e.player.pause())}}),a(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,a=n.getAttribute("seek-value");i.empty(a)&&(a=n.value),n.removeAttribute("seek-value"),e.player.currentTime=a/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!i.element(this.player.elements.display.duration)&&a(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,J.timeUpdate.call(e.player))}),a(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),q.isWebkit&&a(C.call(this.player,'input[type="range"]'),"input",function(t){J.updateRangeFill.call(e.player,t.target)}),a(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return J.updateSeekTooltip.call(e.player,t)}),a(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),a(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),a(this.player.elements.controls,"focusin focusout",function(t){var i=e.player,n=i.config,a=i.elements,s=i.timers;if(w(a.controls,n.classNames.noTransition,"focusin"===t.type),ce.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){w(a.controls,n.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return ce.toggleControls.call(e.player,!1)},r)}}),a(this.player.elements.inputs.volume,"wheel",function(t){var i=t.webkitDirectionInvertedFromDevice,n=0;(t.deltaY<0||t.deltaX>0)&&(i?(e.player.decreaseVolume(.02),n=-1):(e.player.increaseVolume(.02),n=1)),(t.deltaY>0||t.deltaX<0)&&(i?(e.player.increaseVolume(.02),n=1):(e.player.decreaseVolume(.02),n=-1)),(1===n&&e.player.media.volume<1||-1===n&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}},{key:"clear",value:function(){this.global(!1)}}]),e}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var de,pe=(function(e,t){var i;i=function(){var e=function(){},t={},i={},n={};function a(e,t){if(e){var a=n[e];if(i[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,n,a){var s,l,o=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,p=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(l=o.createElement("link")).rel="stylesheet",l.href=p):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(l=o.createElement("img")).src=p:((l=o.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var o=e.type[0];if(s&&"hideFocus"in l)try{l.sheet.cssText.length||(o="e")}catch(e){o="e"}if("e"==o&&(a+=1)<u)return r(t,i,n,a);i(t,o,e.defaultPrevented)},!1!==d(t,l)&&o.head.appendChild(l)}function l(e,i,n){var l,o;if(i&&i.trim&&(l=i),o=(l?n:i)||{},l){if(l in t)throw"LoadJS";t[l]=!0}!function(e,t,i){var n,a,s=(e=e.push?e:[e]).length,l=s,o=[];for(n=function(e,i,n){if("e"==i&&o.push(e),"b"==i){if(!n)return;o.push(e)}--s||t(o)},a=0;a<l;a++)r(e[a],n,i)}(e,function(e){s(o,e),a(l,e)},o)}return l.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,r,l=[],o=e.length,c=o;for(a=function(e,i){i.length&&l.push(e),--c||t(l)};o--;)s=e[o],(r=i[s])?a(s,r):(n[s]=n[s]||[]).push(a)}(e,function(e){s(t,e)}),l},l.done=function(e){a(e,[])},l.reset=function(){t={},i={},n={}},l.isDefined=function(e){return e in t},l},e.exports=i()}(de={exports:{}},de.exports),de.exports);function he(e){return new Promise(function(t,i){pe(e,{success:t,error:i})})}function me(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,l.call(this,this.media,e?"play":"pause"))}var fe={setup:function(){var e=this;w(this.elements.wrapper,this.config.classNames.embed,!0),fe.setAspectRatio.call(this),i.object(window.Vimeo)?fe.ready.call(this):he(this.config.urls.vimeo.sdk).then(function(){fe.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=i.string(e)?e.split(":"):this.config.ratio.split(":"),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var a=(240-n)/4.8;this.media.style.transform="translateY(-"+a+"%)"}},ready:function(){var e=this,t=this,n=G({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),a=t.media.getAttribute("src");i.empty(a)&&(a=t.media.getAttribute(t.config.attributes.embed.id));var s,r=(s=a,i.empty(s)?null:i.number(Number(s))?s:s.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:s),o=m("iframe"),c=V(t.config.urls.vimeo.iframe,r,n);o.setAttribute("src",c),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var u=m("div",{class:t.config.classNames.embedContainer});u.appendChild(o),t.media=v(u,t.media),$(V(t.config.urls.vimeo.api,r),"json").then(function(e){if(!i.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",ce.setPoster.call(t,n.href)}}),t.embed=new window.Vimeo.Player(o,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return me.call(t,!0),t.embed.play()},t.media.pause=function(){return me.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var d=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return d},set:function(e){var i=t.embed,n=t.media,a=t.paused,s=t.volume,r=a&&!i.hasPlayed;n.seeking=!0,l.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return r&&i.pause()}).then(function(){return r&&i.setVolume(s)}).catch(function(){})}});var p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then(function(){p=e,l.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&J.setSpeedMenu.call(t,[])})}});var h=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return h},set:function(e){t.embed.setVolume(e).then(function(){h=e,l.call(t,t.media,"volumechange")})}});var f=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return f},set:function(e){var n=!!i.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){f=n,l.call(t,t.media,"volumechange")})}});var g=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return g},set:function(e){var n=i.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){g=n})}});var y=void 0;t.embed.getVideoUrl().then(function(e){y=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return y}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var i=function(e,t){var i=function e(t,i){return 0===i?t:e(i,t%i)}(e,t);return e/i+":"+t/i}(t[0],t[1]);fe.setAspectRatio.call(e,i)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,ce.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){d=e,l.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,l.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Z.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return t=e.text,i=document.createDocumentFragment(),n=document.createElement("div"),i.appendChild(n),n.innerHTML=t,i.firstChild.innerText;var t,i,n});Z.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){me.call(t,!e),e||l.call(t,t.media,"playing")}),i.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){me.call(t,!0),l.call(t,t.media,"playing")}),t.embed.on("pause",function(){me.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,d=e.seconds,l.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,l.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&l.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,l.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,l.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,l.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,l.call(t,t.media,"error")}),setTimeout(function(){return ce.build.call(t)},0)}};function ge(e){switch(e){case"hd2160":return 2160;case 2160:return"hd2160";case"hd1440":return 1440;case 1440:return"hd1440";case"hd1080":return 1080;case 1080:return"hd1080";case"hd720":return 720;case 720:return"hd720";case"large":return 480;case 480:return"large";case"medium":return 360;case 360:return"medium";case"small":return 240;case 240:return"small";default:return"default"}}function ye(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,l.call(this,this.media,e?"play":"pause"))}var ve,be={setup:function(){var e=this;w(this.elements.wrapper,this.config.classNames.embed,!0),be.setAspectRatio.call(this),i.object(window.YT)&&i.function(window.YT.Player)?be.ready.call(this):(he(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){be.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(i.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(i.empty(n))return this.config.title=n,void ce.setTitle.call(this)}var a=this.config.keys.google;i.string(a)&&!i.empty(a)&&$(V(this.config.urls.youtube.api,e,a)).then(function(e){i.object(e)&&(t.config.title=e.items[0].snippet.title,ce.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(i.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");i.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var a,s=(a=n,i.empty(a)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a),r=e.provider+"-"+Math.floor(1e4*Math.random()),o=m("div",{id:r});e.media=v(o,e.media);var c=function(e){return"https://img.youtube.com/vi/"+s+"/"+e+"default.jpg"};oe(c("maxres"),121).catch(function(){return oe(c("sd"),121)}).catch(function(){return oe(c("hq"))}).then(function(t){return ce.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(r,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!i.object(e.media.error)){var n={code:t.data};switch(t.data){case 2:n.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:n.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:n.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:n.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:n.message="An unknown error occured"}e.media.error=n,l.call(e,e.media,"error")}},onPlaybackQualityChange:function(){l.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),l.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;be.getTitle.call(e,s),e.media.play=function(){ye.call(e,!0),n.playVideo()},e.media.pause=function(){ye.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,l.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return ge(n.getPlaybackQuality())},set:function(t){var i=t;n.setPlaybackQuality(ge(i)),l.call(e,e.media,"qualityrequested",!1,{quality:i})}});var a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,n.setVolume(100*a),l.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var a=i.boolean(t)?t:r;r=a,n[a?"mute":"unMute"](),l.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),l.call(e,e.media,"timeupdate"),l.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&l.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),l.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return ce.build.call(e)},50)},onStateChange:function(t){var n,a=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,l.call(e,e.media,"seeked")),t.data){case-1:l.call(e,e.media,"timeupdate"),e.media.buffered=a.getVideoLoadedFraction(),l.call(e,e.media,"progress");break;case 0:ye.call(e,!1),e.media.loop?(a.stopVideo(),a.playVideo()):l.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(ye.call(e,!0),l.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){l.call(e,e.media,"timeupdate")},50),e.media.duration!==a.getDuration()&&(e.media.duration=a.getDuration(),l.call(e,e.media,"durationchange")),J.setQualityMenu.call(e,(n=a.getAvailableQualityLevels(),i.empty(n)?n:j(n.map(function(e){return ge(e)})))));break;case 2:e.muted||e.embed.unMute(),ye.call(e,!1)}l.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},ke={setup:function(){if(this.media)if(w(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),w(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&w(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=m("div",{class:this.config.classNames.video}),p(this.media,this.elements.wrapper),this.elements.poster=m("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":be.setup.call(this);break;case"vimeo":fe.setup.call(this)}else this.isHTML5&&O.extend.call(this);else this.debug.warn("No media element found!")}},we=function(){function e(t){var i=this;o(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return c(e,[{key:"load",value:function(){var e=this;this.enabled&&(i.object(window.google)&&i.object(window.google.ima)?this.ready():he(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=m("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Q(Math.max(e.manager.getRemainingTime(),0)),i=U("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),i.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(i.element(n)){var a=100/t.player.duration*e,s=m("span",{class:t.player.config.classNames.cues});s.style.left=a.toString()+"%",n.appendChild(s)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),a=function(e){var i="ads"+e.replace(/_/g,"").toLowerCase();l.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;i.empty(e.cuePoints)||e.cuePoints.forEach(function(i,a){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,a=Array(n>1?n-1:0),s=1;s<n;s++)a[s-1]=arguments[s];var r=this.events[e];i.array(r)&&r.forEach(function(e){i.function(e)&&e.apply(t,a)})}},{key:"on",value:function(e,t){return i.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){i.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!i.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+G({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),Te={insertElements:function(e,t){var n=this;i.string(t)?f(e,this.media,{src:t}):i.array(t)&&t.forEach(function(t){f(e,n.media,t)})},change:function(e){var t=this;i.object(e)&&"sources"in e&&e.sources.length?(O.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],g(t.media),t.media=null,i.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=i.empty(e.sources[0].provider)?te.html5:e.sources[0].provider,t.supported=I.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=m("video");break;case"html5:audio":t.media=m("audio");break;case"youtube:video":case"vimeo:video":t.media=m("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),i.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),i.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),ce.addStyleHook.call(t),t.isHTML5&&Te.insertElements.call(t,"source",e.sources),t.config.title=e.title,ke.setup.call(t),t.isHTML5&&("tracks"in e&&Te.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ce.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Ae=function(){function e(t,n){var a=this;if(o(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=I.touch,this.media=t,i.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||i.nodeList(this.media)||i.array(this.media))&&(this.media=this.media[0]),this.config=R({},ee,e.defaults,n||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ae(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",I),!i.nullOrUndefined(this.media)&&i.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(I.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var l=this.media.tagName.toLowerCase(),c=null,u=null;switch(l){case"div":if(c=this.media.querySelector("iframe"),i.element(c)){if(u=X(c.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?te.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?te.vimeo:null}(u.toString()),this.elements.container=this.media,this.media=c,this.elements.container.className="",!u.searchParams){var d=["1","true"];d.includes(u.searchParams.get("autoplay"))&&(this.config.autoplay=!0),d.includes(u.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=d.includes(u.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(i.empty(this.provider)||!Object.keys(te).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=ie.video;break;case"video":case"audio":this.type=l,this.provider=te.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=I.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.listeners=new ue(this),this.storage=new z(this),this.media.plyr=this,i.element(this.elements.container)||(this.elements.container=m("div"),p(this.media,this.elements.container)),this.elements.container.setAttribute("tabindex",0),ce.addStyleHook.call(this),ke.setup.call(this),this.config.debug&&s(this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ce.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new le(this),this.ads=new we(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return c(e,[{key:"play",value:function(){return i.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&i.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(i.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):i.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(i.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(i.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(i.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(i.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=i.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);S(this.elements.buttons.captions,t),w(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,l.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){I.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=T(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,a=w(this.elements.container,this.config.classNames.hideControls,n);if(a&&this.config.controls.includes("settings")&&!i.empty(this.config.settings)&&J.toggleMenu.call(this,!1),a!==t){var s=a?"controlshidden":"controlsshown";l.call(this,this.media,s)}return!a}return!1}},{key:"on",value:function(e,t){s(this.elements.container,e,t)}},{key:"off",value:function(e,t){r(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var a=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(g(t.elements.buttons.play),g(t.elements.captions),g(t.elements.controls),g(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),i.function(e)&&e()):(t.listeners.clear(),v(t.elements.original,t.elements.container),l.call(t,t.elements.original,"destroyed",!0),i.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),ce.toggleNativeControls.call(this,!0),a();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&i.function(this.embed.destroy)&&this.embed.destroy(),a();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(a),setTimeout(a,200)}}}},{key:"supports",value:function(e){return I.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===te.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===te.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===te.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===ie.video)}},{key:"isAudio",get:function(){return Boolean(this.type===ie.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=i.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return i.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;i.string(t)&&(t=Number(t)),i.number(t)||(t=this.storage.get("volume")),i.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!i.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;i.boolean(t)||(t=this.storage.get("muted")),i.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;i.number(e)&&(t=e),i.number(t)||(t=this.storage.get("speed")),i.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=null;if(i.empty(e)||(t=Number(e)),i.number(t)||(t=this.storage.get("quality")),i.number(t)||(t=this.config.quality.selected),i.number(t)||(t=this.config.quality.default),this.options.quality.length){if(!this.options.quality.includes(t)){var n=function(e,t){return i.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null}(this.options.quality,t);this.debug.warn("Unsupported quality option: "+t+", using "+n+" instead"),t=n}this.config.quality.selected=t,this.media.quality=t}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=i.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){Te.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?ce.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=i.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Z.set.call(this,e)},get:function(){var e=this.captions,t=e.active,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){Z.setLanguage.call(this,e)},get:function(){return(Z.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(I.pip){var a=i.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(a?t:n)}},get:function(){return I.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,i){return I.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return he(e)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null;return i.string(t)?a=Array.from(document.querySelectorAll(t)):i.nodeList(t)?a=Array.from(t):i.array(t)&&(a=t.filter(i.element)),i.empty(a)?null:a.map(function(t){return new e(t,n)})}}]),e}();return Ae.defaults=(ve=ee,JSON.parse(JSON.stringify(ve))),Ae}); +"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e=function(e){return null!=e?e.constructor:null},t=function(e,t){return Boolean(e&&t&&e instanceof t)},i={object:function(t){return e(t)===Object},number:function(t){return e(t)===Number&&!Number.isNaN(t)},string:function(t){return e(t)===String},boolean:function(t){return e(t)===Boolean},function:function(t){return e(t)===Function},array:function(e){return!i.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return t(e,WeakMap)},nodeList:function(e){return t(e,NodeList)},element:function(e){return t(e,Element)},textNode:function(t){return e(t)===Text},event:function(e){return t(e,Event)},cue:function(e){return t(e,window.TextTrackCue)||t(e,window.VTTCue)},track:function(e){return t(e,TextTrack)||!i.nullOrUndefined(e)&&i.string(e.kind)},url:function(e){return!i.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return i.nullOrUndefined(e)||(i.string(e)||i.array(e)||i.nodeList(e))&&!e.length||i.object(e)&&!Object.keys(e).length}},n=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function a(e,t,s){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this,c=arguments.length>5&&void 0!==arguments[5]&&arguments[5],u=arguments.length>6&&void 0!==arguments[6]&&arguments[6];if(!i.empty(e)&&!i.empty(t)&&i.function(s))if(i.nodeList(e)||i.array(e))Array.from(e).forEach(function(e){e instanceof Node&&a.call(null,e,t,s,r,l,c)});else{var d=t.split(" "),p=c;n&&(p={passive:l,capture:c}),d.forEach(function(t){o&&o.eventListeners&&r&&!u&&o.eventListeners.push({elements:e,type:t,callback:s,options:p}),e[r?"addEventListener":"removeEventListener"](t,s,p)})}}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a.call(this,e,t,i,!0,n,s)}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a.call(this,e,t,i,!1,n,s)}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments[2],n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];a(e,t,function a(){r(e,t,a,n,s);for(var l=arguments.length,o=Array(l),c=0;c<l;c++)o[c]=arguments[c];i.apply(this,o)},!0,n,s,!0)}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i.element(e)&&!i.empty(t)){var s=new CustomEvent(t,{bubbles:n,detail:Object.assign({},a,{plyr:this})});e.dispatchEvent(s)}}var c=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=function(){function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,i,n){return i&&e(t.prototype,i),n&&e(t,n),t}}(),d=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},p=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var i=[],n=!0,a=!1,s=void 0;try{for(var r,l=e[Symbol.iterator]();!(n=(r=l.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){a=!0,s=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw s}}return i}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function h(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach(function(e,i){var n=i>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;n.appendChild(e),s?a.insertBefore(n,s):a.appendChild(n)})}function m(e,t){i.element(e)&&!i.empty(t)&&Object.entries(t).forEach(function(t){var i=p(t,2),n=i[0],a=i[1];e.setAttribute(n,a)})}function f(e,t,n){var a=document.createElement(e);return i.object(t)&&m(a,t),i.string(n)&&(a.innerText=n),a}function g(e,t,i,n){t.appendChild(f(e,i,n))}function y(e){i.nodeList(e)||i.array(e)?Array.from(e).forEach(y):i.element(e)&&i.element(e.parentNode)&&e.parentNode.removeChild(e)}function v(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function b(e,t){return i.element(t)&&i.element(t.parentNode)&&i.element(e)?(t.parentNode.replaceChild(e,t),e):null}function k(e,t){if(!i.string(e)||i.empty(e))return{};var n={},a=t;return e.split(",").forEach(function(e){var t=e.trim(),s=t.replace(".",""),r=t.replace(/[[\]]/g,"").split("="),l=r[0],o=r.length>1?r[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":i.object(a)&&i.string(a.class)&&(a.class+=" "+s),n.class=s;break;case"#":n.id=t.replace("#","");break;case"[":n[l]=o}}),n}function w(e,t){if(i.element(e)){var n=t;i.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function T(e,t,n){if(i.element(e)){var a="toggle";return void 0!==n&&(a=n?"add":"remove"),e.classList[a](t),e.classList.contains(t)}return null}function A(e,t){return i.element(e)&&e.classList.contains(t)}function C(e,t){var i={Element:Element};return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function E(e){return this.elements.container.querySelectorAll(e)}function P(e){return this.elements.container.querySelector(e)}function S(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}function N(e,t){if(i.array(e)||i.nodeList(e))Array.from(e).forEach(function(e){return N(e,t)});else if(i.element(e)){var n="true"===e.getAttribute("aria-pressed"),a=i.boolean(t)?t:!n;e.setAttribute("aria-pressed",a)}}var L,x,M,_=(L=document.createElement("span"),x={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},M=Object.keys(x).find(function(e){return void 0!==L.style[e]}),!!i.string(M)&&x[M]);var I,q={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},j={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=!1,a=!1,s=q.isIPhone&&i&&j.playsinline;switch(t+":"+e){case"html5:video":a=(n=j.video)&&j.rangeInput&&(!q.isIPhone||s);break;case"html5:audio":a=(n=j.audio)&&j.rangeInput;break;case"youtube:video":case"vimeo:video":n=!0,a=j.rangeInput&&(!q.isIPhone||s);break;default:a=(n=j.audio&&j.video)&&j.rangeInput}return{api:n,ui:a}},pip:!q.isIPhone&&i.function(f("video").webkitSetPresentationMode),airplay:i.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!i.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),rangeInput:(I=document.createElement("input"),I.type="range","range"===I.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==_,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},O={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return j.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return O.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=O.getSources.call(e).filter(function(t){return t.getAttribute("src")===e.source}),i=p(t,1)[0];return i&&Number(i.getAttribute("size"))},set:function(t){var i=O.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(i){var n=e.currentTime,a=e.playing;e.media.src=i.getAttribute("src");e.once("loadedmetadata",function(){e.currentTime=n}),e.media.load(),a&&e.play(),o.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(y(O.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function R(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];if(!n.length)return e;var s=n.shift();return i.object(s)?(Object.keys(s).forEach(function(t){i.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,d({},t,{})),R(e[t],s[t])):Object.assign(e,d({},t,s[t]))}),R.apply(void 0,[e].concat(n))):e}function V(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];return i.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return i.string(n[t])?n[t]:""})}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())}function B(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function D(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=H(e,"-"," "),e=H(e,"_"," "),H(e=B(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function F(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var U=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i.empty(e)||i.empty(t))return"";var n,a=(n=t.i18n,e.split(".").reduce(function(e,t){return e&&e[t]},n));if(i.empty(a))return"";var s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach(function(e){var t=p(e,2),i=t[0],n=t[1];a=H(a,i,n)}),a};function z(e){return i.array(e)?e.filter(function(t,i){return e.indexOf(t)===i}):e}var W=function(){function e(t){c(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return u(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(i.empty(n))return null;var a=JSON.parse(n);return i.string(t)&&t.length?a[t]:a}},{key:"set",value:function(t){if(e.supported&&this.enabled&&i.object(t)){var n=this.get();i.empty(n)&&(n={}),R(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function K(e,t){if(i.string(e)){var n=i.string(t),a=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,n&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!a()){var r=W.supported,l=document.createElement("div");if(l.setAttribute("hidden",""),n&&l.setAttribute("id",t),r){var o=window.localStorage.getItem("cache-"+t);if(null!==o){var c=JSON.parse(o);s(l,c.content)}}fetch(e).then(function(e){i.empty(e)||(r&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),s(l,e))}).catch(function(){})}}}var Y=function(e){return parseInt(e/60/60%60,10)},Q=function(e){return parseInt(e/60%60,10)},J=function(e){return parseInt(e%60,10)};function $(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!i.number(e))return $(null,t,n);var a=function(e){return("0"+e).slice(-2)},s=Y(e),r=Q(e),l=J(e);return t||s>0?s+=":":s="",(n?"-":"")+s+a(r)+":"+a(l)}var X={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||q.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=P.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:E.call(this,this.config.selectors.buttons.play),pause:P.call(this,this.config.selectors.buttons.pause),restart:P.call(this,this.config.selectors.buttons.restart),rewind:P.call(this,this.config.selectors.buttons.rewind),fastForward:P.call(this,this.config.selectors.buttons.fastForward),mute:P.call(this,this.config.selectors.buttons.mute),pip:P.call(this,this.config.selectors.buttons.pip),airplay:P.call(this,this.config.selectors.buttons.airplay),settings:P.call(this,this.config.selectors.buttons.settings),captions:P.call(this,this.config.selectors.buttons.captions),fullscreen:P.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=P.call(this,this.config.selectors.progress),this.elements.inputs={seek:P.call(this,this.config.selectors.inputs.seek),volume:P.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:P.call(this,this.config.selectors.display.buffer),currentTime:P.call(this,this.config.selectors.display.currentTime),duration:P.call(this,this.config.selectors.display.duration)},i.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var i=X.getIconUrl.call(this),n=(i.cors?"":i.url)+"#"+this.config.iconPrefix,a=document.createElementNS("http://www.w3.org/2000/svg","svg");m(a,R(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),r=n+"-"+e;return"href"in s?s.setAttributeNS("http://www.w3.org/1999/xlink","href",r):s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r),a.appendChild(s),a},createLabel:function(e,t){var i=U(e,this.config),n=Object.assign({},t);switch(e){case"pip":i="PIP";break;case"airplay":i="AirPlay"}return"class"in n?n.class+=" "+this.config.classNames.hidden:n.class=this.config.classNames.hidden,f("span",n,i)},createBadge:function(e){if(i.empty(e))return null;var t=f("span",{class:this.config.classNames.menu.value});return t.appendChild(f("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=f("button"),a=Object.assign({},t),s=D(e),r=!1,l=void 0,o=void 0,c=void 0,u=void 0;switch("type"in a||(a.type="button"),"class"in a?a.class.includes(this.config.classNames.control)&&(a.class+=" "+this.config.classNames.control):a.class=this.config.classNames.control,e){case"play":r=!0,l="play",c="pause",o="play",u="pause";break;case"mute":r=!0,l="mute",c="unmute",o="volume",u="muted";break;case"captions":r=!0,l="enableCaptions",c="disableCaptions",o="captions-off",u="captions-on";break;case"fullscreen":r=!0,l="enterFullscreen",c="exitFullscreen",o="enter-fullscreen",u="exit-fullscreen";break;case"play-large":a.class+=" "+this.config.classNames.control+"--overlaid",s="play",l="play",o="play";break;default:l=s,o=e}return r?(n.appendChild(X.createIcon.call(this,u,{class:"icon--pressed"})),n.appendChild(X.createIcon.call(this,o,{class:"icon--not-pressed"})),n.appendChild(X.createLabel.call(this,c,{class:"label--pressed"})),n.appendChild(X.createLabel.call(this,l,{class:"label--not-pressed"})),a["aria-pressed"]=!1):(n.appendChild(X.createIcon.call(this,o)),n.appendChild(X.createLabel.call(this,l))),R(a,k(this.config.selectors.buttons[s],a)),m(n,a),"play"===s?(i.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(n)):this.elements.buttons[s]=n,n},createRange:function(e,t){var i=f("label",{for:t.id,id:t.id+"-label",class:this.config.classNames.hidden},U(e,this.config)),n=f("input",R(k(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-labelledby":t.id+"-label","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,X.updateRangeFill.call(this,n),{label:i,input:n}},createProgress:function(e,t){var i=f("progress",R(k(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){i.appendChild(f("span",null,"0"));var n="";switch(e){case"played":n=U("played",this.config);break;case"buffer":n=U("buffered",this.config)}i.innerText="% "+n.toLowerCase()}return this.elements.display[e]=i,i},createTime:function(e){var t=k(this.config.selectors.display[e]),i=f("div",R(t,{class:"plyr__time "+t.class,"aria-label":U(e,this.config)}),"00:00");return this.elements.display[e]=i,i},createMenuItem:function(e){var t=e.value,n=e.list,a=e.type,s=e.title,r=e.badge,l=void 0===r?null:r,o=e.checked,c=void 0!==o&&o,u=f("li"),d=f("label",{class:this.config.classNames.control}),p=f("input",R(k(this.config.selectors.inputs[a]),{type:"radio",name:"plyr-"+a,value:t,checked:c,class:"plyr__sr-only"})),h=f("span",{hidden:""});d.appendChild(p),d.appendChild(h),d.insertAdjacentHTML("beforeend",s),i.element(l)&&d.appendChild(l),u.appendChild(d),n.appendChild(u)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(i.element(e)&&i.number(t)){var a=Y(this.duration)>0;e.innerText=$(t,a,n)}},updateVolume:function(){this.supported.ui&&(i.element(this.elements.inputs.volume)&&X.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),i.element(this.elements.buttons.mute)&&N(this.elements.buttons.mute,this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;i.element(e)&&(e.value=t,X.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&i.event(e)){var n,a,s=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,a=this.duration,s=0===n||0===a||Number.isNaN(n)||Number.isNaN(a)?0:(n/a*100).toFixed(2),"timeupdate"===e.type&&X.setRange.call(this,this.elements.inputs.seek,s);break;case"playing":case"progress":!function(e,n){var a=i.number(n)?n:0,s=i.element(e)?e:t.elements.display.buffer;if(i.element(s)){s.value=a;var r=s.getElementsByTagName("span")[0];i.element(r)&&(r.childNodes[0].nodeValue=a)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=i.event(e)?e.target:e;i.element(t)&&"range"===t.getAttribute("type")&&(t.setAttribute("aria-valuenow",t.value),q.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%"))},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&i.element(this.elements.inputs.seek)&&i.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,a=this.elements.progress.getBoundingClientRect(),s=this.config.classNames.tooltip+"--visible",r=function(e){T(t.elements.display.seekTooltip,s,e)};if(this.touch)r(!1);else{if(i.event(e))n=100/a.width*(e.pageX-a.left);else{if(!A(this.elements.display.seekTooltip,s))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),X.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",i.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!i.element(this.elements.display.duration)&&this.config.invertTime;X.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||X.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){var e=i.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&X.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&X.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),X.updateSeekTooltip.call(this)}},toggleTab:function(e,t){w(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(i.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");i.array(e)&&(this.options.quality=z(e).filter(function(e){return t.config.quality.options.includes(e)}));var a=!i.empty(this.options.quality)&&this.options.quality.length>1;if(X.toggleTab.call(this,"quality",a),X.checkMenu.call(this),a){v(n);this.options.quality.sort(function(e,i){var n=t.config.quality.options;return n.indexOf(e)>n.indexOf(i)?1:-1}).forEach(function(e){X.createMenuItem.call(t,{value:e,list:n,type:"quality",title:X.getLabel.call(t,"quality",e),badge:function(e){var i=U("qualityBadge."+e,t.config);return i.length?X.createBadge.call(t,i):null}(e)})}),X.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?U("normal",this.config):t+"×";case"quality":if(i.number(t)){var n=U("qualityLabel."+t,this.config);return n.length?n:t+"p"}return B(t);case"captions":return te.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var a=this.elements.settings.panes[e],s=null,r=t;switch(e){case"captions":s=this.currentTrack;break;default:if(s=i.empty(n)?this[e]:n,i.empty(s)&&(s=this.config[e].default),!i.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '"+s+"' for "+e);if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '"+s+"' for "+e)}if(i.element(r)||(r=a&&a.querySelector("ul")),i.element(r)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=X.getLabel.call(this,e,s);var l=r&&r.querySelector('input[value="'+s+'"]');i.element(l)&&(l.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),i=te.getTracks.call(this);if(X.toggleTab.call(this,"captions",i.length),v(t),X.checkMenu.call(this),i.length){var n=i.map(function(i,n){return{value:n,checked:e.captions.active&&e.currentTrack===n,title:te.getLabel.call(e,i),badge:i.language&&X.createBadge.call(e,i.language.toUpperCase()),list:t,type:"language"}});n.unshift({value:-1,checked:!this.captions.active,title:U("disabled",this.config),list:t,type:"language"}),n.forEach(X.createMenuItem.bind(this)),X.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&i.element(this.elements.settings.panes.speed)){i.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!i.empty(this.options.speed)&&this.options.speed.length>1;if(X.toggleTab.call(this,"speed",n),X.checkMenu.call(this),n){var a=this.elements.settings.panes.speed.querySelector("ul");v(a),this.options.speed.forEach(function(e){X.createMenuItem.call(t,{value:e,list:a,type:"speed",title:X.getLabel.call(t,"speed",e)})}),X.updateSetting.call(this,"speed",a)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!i.empty(e)&&Object.values(e).some(function(e){return!e.hidden});w(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(i.element(t)&&i.element(n)){var a=i.boolean(e)?e:i.element(t)&&t.hasAttribute("hidden");if(i.event(e)){var s=i.element(t)&&t.contains(e.target),r=e.target===this.elements.buttons.settings;if(s||!s&&!r&&a)return;r&&e.stopPropagation()}i.element(n)&&n.setAttribute("aria-expanded",a),i.element(t)&&(w(t,!a),T(this.elements.container,this.config.classNames.menu.open,a),a?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var i=t.scrollWidth,n=t.scrollHeight;return y(t),{width:i,height:n}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,n=document.getElementById(e);if(i.element(n)&&"tabpanel"===n.getAttribute("role")){var a=t.querySelector('[role="tabpanel"]:not([hidden])'),s=a.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+a.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),j.transitions&&!j.reducedMotion){s.style.width=a.scrollWidth+"px",s.style.height=a.scrollHeight+"px";var r=X.getTabSize.call(this,n);l(s,_,function(e){e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="")}),s.style.width=r.width+"px",s.style.height=r.height+"px"}w(a,!0),a.setAttribute("tabindex",-1),w(n,!1);var o=E.call(this,'[aria-controls="'+e+'"]');Array.from(o).forEach(function(e){e.setAttribute("aria-expanded",!0)}),n.removeAttribute("tabindex"),n.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(i.empty(this.config.controls))return null;var n=f("div",k(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(X.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(X.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(X.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(X.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var a=f("div",k(this.config.selectors.progress)),s=X.createRange.call(this,"seek",{id:"plyr-seek-"+e.id});if(a.appendChild(s.label),a.appendChild(s.input),a.appendChild(X.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=f("span",{class:this.config.classNames.tooltip},"00:00");a.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=a,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(X.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(X.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(X.createButton.call(this,"mute")),this.config.controls.includes("volume")){var l=f("div",{class:"plyr__volume"}),o={max:1,step:.05,value:this.config.volume},c=X.createRange.call(this,"volume",R(o,{id:"plyr-volume-"+e.id}));l.appendChild(c.label),l.appendChild(c.input),this.elements.volume=l,n.appendChild(l)}if(this.config.controls.includes("captions")&&n.appendChild(X.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!i.empty(this.config.settings)){var u=f("div",{class:"plyr__menu",hidden:""});u.appendChild(X.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var d=f("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),p=f("div"),h=f("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),m=f("ul",{role:"tablist"});this.config.settings.forEach(function(i){var n=f("li",{role:"tab",hidden:""}),a=f("button",R(k(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+i+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+i,"aria-expanded":!1}),U(i,t.config)),s=f("span",{class:t.config.classNames.menu.value});s.innerHTML=e[i],a.appendChild(s),n.appendChild(a),m.appendChild(n),t.elements.settings.tabs[i]=n}),h.appendChild(m),p.appendChild(h),this.config.settings.forEach(function(i){var n=f("div",{id:"plyr-settings-"+e.id+"-"+i,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+i+"-tab",role:"tabpanel",tabindex:-1}),a=f("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},U(i,t.config));n.appendChild(a);var s=f("ul");n.appendChild(s),p.appendChild(n),t.elements.settings.panes[i]=n}),d.appendChild(p),u.appendChild(d),n.appendChild(u),this.elements.settings.form=d,this.elements.settings.menu=u}return this.config.controls.includes("pip")&&j.pip&&n.appendChild(X.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&j.airplay&&n.appendChild(X.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(X.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(X.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&X.setQualityMenu.call(this,O.getQualityOptions.call(this)),X.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=X.getIconUrl.call(this);t.cors&&K(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var a={id:this.id,seektime:this.config.seekTime,title:this.config.title},s=!0;i.string(this.config.controls)||i.element(this.config.controls)?n=this.config.controls:i.function(this.config.controls)?n=this.config.controls.call(this,a):(n=X.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:te.getLabel.call(this)}),s=!1);var r=function(e){var t=e;return Object.entries(a).forEach(function(e){var i=p(e,2),n=i[0],a=i[1];t=H(t,"{"+n+"}",a)}),t};s&&(i.string(this.config.controls)?n=r(n):i.element(n)&&(n.innerHTML=r(n.innerHTML)));var l,o=void 0;if(i.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),i.element(o)||(o=this.elements.container),i.element(n)?o.appendChild(n):n&&o.insertAdjacentHTML("beforeend",n),i.element(this.elements.controls)||X.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(l=o,setTimeout(function(){w(l,!0),l.offsetHeight,w(l,!1)},0)),this.config.tooltips.controls){var c=E.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(c).forEach(function(t){T(t,e.config.classNames.hidden,!1),T(t,e.config.classNames.tooltip,!0),t.setAttribute("role","tooltip")})}}};function G(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(i,n){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{i(JSON.parse(a.responseText))}catch(e){i(a.responseText)}else i(a.response)}),a.addEventListener("error",function(){throw new Error(a.statusText)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){n(e)}})}function Z(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var i=document.createElement("a");i.href=t,t=i.href}try{return new URL(t)}catch(e){return null}}function ee(e){if(!i.object(e))return"";var t=new URLSearchParams;return Object.entries(e).forEach(function(e){var i=p(e,2),n=i[0],a=i[1];t.set(n,a)}),t}var te={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!j.textTracks)i.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&X.setCaptionsMenu.call(this);else{var e,t;if(i.element(this.elements.captions)||(this.elements.captions=f("div",k(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),q.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),i=Z(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&G(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){y(e)})})}var a=this.storage.get("captions");i.boolean(a)||(a=this.config.captions.active);var r=this.storage.get("language")||this.config.captions.language;if("auto"===r){var l=(navigator.language||navigator.userLanguage).split("-");r=p(l,1)[0]}if(te.setLanguage.call(this,r,a),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";s.call(this,this.media.textTracks,o,te.update.bind(this))}setTimeout(te.update.bind(this),0)}},update:function(){var e=this,t=te.getTracks.call(this,!0),n=this.captions,a=n.language,r=n.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!r.get(e)}).forEach(function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),t.mode="hidden",s.call(e,t,"cuechange",function(){return te.updateCues.call(e)})});var l=!t.find(function(t){return t===e.captions.currentTrackNode}),o=this.language!==a&&t.find(function(e){return e.language===a});(l||o)&&te.setLanguage.call(this,a,this.config.captions.active),T(this.elements.container,this.config.classNames.captions.enabled,!i.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&X.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],a=te.getTracks.call(this);if(-1!==e)if(i.number(e))if(e in a){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var s=te.getCurrentTrack.call(this),r=(s||{}).language;this.captions.currentTrackNode=s,t&&(this.captions.language=r),this.isVimeo&&this.embed.enableTextTrack(r),o.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&te.updateCues.call(this),n&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(i.string(e)){this.captions.language=e.toLowerCase();var n=te.getTracks.call(this),a=te.getCurrentTrack.call(this,!0);te.set.call(this,n.indexOf(a),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(i){return!e.isHTML5||t||e.captions.meta.has(i)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=te.getTracks.call(this),n=function(t){return Number((e.captions.meta.get(t)||{}).default)},a=Array.from(i).sort(function(e,t){return n(t)-n(e)});return!t&&i[this.currentTrack]||a.find(function(t){return t.language===e.captions.language})||a[0]},getLabel:function(e){var t=e;return!i.track(t)&&j.textTracks&&this.captions.active&&(t=te.getCurrentTrack.call(this)),i.track(t)?i.empty(t.label)?i.empty(t.language)?U("enabled",this.config):e.language.toUpperCase():t.label:U("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(i.element(this.elements.captions))if(i.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=te.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(F)}var a=t.map(function(e){return e.trim()}).join("\n");if(a!==this.elements.captions.innerHTML){v(this.elements.captions);var s=f("span",k(this.config.selectors.caption));s.innerHTML=a,this.elements.captions.appendChild(s),o.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},ie={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},ne={html5:"html5",youtube:"youtube",vimeo:"vimeo"},ae={audio:"audio",video:"video"};var se=function(){},re=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];c(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return u(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):se}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):se}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):se}}]),e}();function le(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;i.element(e)&&N(e,this.active),o.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),q.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(i.element(e)){var n=E.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),a=n[0],l=n[n.length-1],o=function(e){if("Tab"===e.key&&9===e.keyCode){var t=S();t!==l||e.shiftKey?t===a&&e.shiftKey&&(l.focus(),e.preventDefault()):(a.focus(),e.preventDefault())}};t?s(this.elements.container,"keydown",o,!1):r(this.elements.container,"keydown",o,!1)}}.call(this.player,this.target,this.active)}}function oe(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",T(this.target,this.player.config.classNames.fullscreen.fallback,e),le.call(this)}var ce=function(){function e(t){var n=this;c(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},s.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){le.call(n)}),s.call(this.player,this.player.elements.container,"dblclick",function(e){i.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return u(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),T(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(q.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?i.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():oe.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(q.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!i.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else oe.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:A(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return q.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(i.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!i.function(document[t+"ExitFullscreen"])&&!i.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function ue(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(i,n){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?i:n)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var de={addStyleHook:function(){T(this.elements.container,this.config.selectors.container.replace(".",""),!0),T(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void de.toggleNativeControls.call(this,!0);i.element(this.elements.controls)||(X.inject.call(this),this.listeners.controls()),de.toggleNativeControls.call(this),this.isHTML5&&te.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,X.updateVolume.call(this),X.timeUpdate.call(this),de.checkPlaying.call(this),T(this.elements.container,this.config.classNames.pip.supported,j.pip&&this.isHTML5&&this.isVideo),T(this.elements.container,this.config.classNames.airplay.supported,j.airplay&&this.isHTML5),T(this.elements.container,this.config.classNames.isIos,q.isIos),T(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){o.call(e,e.media,"ready")},0),de.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&de.setPoster.call(this,this.poster),this.config.duration&&X.durationUpdate.call(this)},setTitle:function(){var e=U("play",this.config);if(i.string(this.config.title)&&!i.empty(this.config.title)&&(e+=", "+this.config.title,this.elements.container.setAttribute("aria-label",this.config.title)),i.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=P.call(this,"iframe");if(!i.element(t))return;var n=i.empty(this.config.title)?"video":this.config.title,a=U("frameTitle",this.config);t.setAttribute("title",a.replace("{title}",n))}},togglePoster:function(e){T(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!i.element(this.elements.poster))return Promise.reject();var n=ue(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),de.togglePoster.call(t,!0),e});return n.catch(function(){return de.togglePoster.call(t,!1)}),n},checkPlaying:function(e){T(this.elements.container,this.config.classNames.playing,this.playing),T(this.elements.container,this.config.classNames.paused,this.paused),T(this.elements.container,this.config.classNames.stopped,this.stopped),N(this.elements.buttons.play,this.playing),i.event(e)&&"timeupdate"===e.type||de.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){T(t.elements.container,t.config.classNames.loading,t.loading),de.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},pe=function(){function e(t){c(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return u(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&i.number(n)){if(a){var r=S();if(i.element(r)&&r!==this.player.elements.inputs.seek&&C(r,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:s||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:s||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:s||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){X.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,T(this.player.elements.container,this.player.config.classNames.isTouch,!0)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&a.call(this.player,window,"keydown keyup",this.handleKey,e,!1),a.call(this.player,document.body,"click",this.toggleMenu,e),l(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&s.call(this.player,this.player.elements.container,"keydown keyup",this.handleKey,!1),s.call(this.player,this.player.elements.container,"focusout",function(t){T(t.target,e.player.config.classNames.tabFocus,!1)}),s.call(this.player,this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){T(S(),e.player.config.classNames.tabFocus,!0)},0)}),s.call(this.player,this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var i=e.player.elements.controls;"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var n=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(de.toggleControls.call(e.player,!0),n=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return de.toggleControls.call(e.player,!1)},n)})}},{key:"media",value:function(){var e=this;if(s.call(this.player,this.player.media,"timeupdate seeking seeked",function(t){return X.timeUpdate.call(e.player,t)}),s.call(this.player,this.player.media,"durationchange loadeddata loadedmetadata",function(t){return X.durationUpdate.call(e.player,t)}),s.call(this.player,this.player.media,"canplay",function(){w(e.player.elements.volume,!e.player.hasAudio),w(e.player.elements.buttons.mute,!e.player.hasAudio)}),s.call(this.player,this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),s.call(this.player,this.player.media,"progress playing seeking seeked",function(t){return X.updateProgress.call(e.player,t)}),s.call(this.player,this.player.media,"volumechange",function(t){return X.updateVolume.call(e.player,t)}),s.call(this.player,this.player.media,"playing play pause ended emptied timeupdate",function(t){return de.checkPlaying.call(e.player,t)}),s.call(this.player,this.player.media,"waiting canplay seeked playing",function(t){return de.checkLoading.call(e.player,t)}),s.call(this.player,this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=P.call(this.player,"."+this.player.config.classNames.video);if(!i.element(t))return;s.call(this.player,t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&s.call(this.player,this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),s.call(this.player,this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),s.call(this.player,this.player.media,"ratechange",function(){X.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),s.call(this.player,this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),s.call(this.player,this.player.media,"qualitychange",function(t){X.updateSetting.call(e.player,"quality",null,t.detail.quality)}),s.call(this.player,this.player.media,"languagechange",function(){X.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),s.call(this.player,this.player.media,"captionsenabled captionsdisabled",function(){X.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),s.call(this.player,this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var i=t.detail,n=void 0===i?{}:i;"error"===t.type&&(n=e.player.media.error),o.call(e.player,e.player.elements.container,t.type,!0,n)})}},{key:"controls",value:function(){var e=this,t=q.isIE?"change":"input",n=function(t,n,a){var s=e.player.config.listeners[a],r=!0;i.function(s)&&(r=s.call(e.player,t)),r&&i.function(n)&&n.call(e.player,t)},a=function(t,a,r,l){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],c=e.player.config.listeners[l],u=i.function(c);s.call(e.player,t,a,function(e){return n(e,r,l)},o&&!u)};a(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),a(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),a(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),a(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),a(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),a(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),a(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),a(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),a(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),a(this.player.elements.buttons.settings,"click",function(t){X.toggleMenu.call(e.player,t)}),a(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";X.showTab.call(e.player,t)};if(C(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(C(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(C(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var a=t.target;X.showTab.call(e.player,a.getAttribute("aria-controls"))}}),a(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var i=e.player.elements.progress.getBoundingClientRect(),n=100/i.width*(t.pageX-i.left);t.currentTarget.setAttribute("seek-value",n)}),a(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var i=t.currentTarget,n=t.keyCode?t.keyCode:t.which,a=t.type;if("keydown"!==a&&"keyup"!==a||39===n||37===n){var s=i.hasAttribute("play-on-seeked"),r=["mouseup","touchend","keyup"].includes(t.type);s&&r?(i.removeAttribute("play-on-seeked"),e.player.play()):!r&&e.player.playing&&(i.setAttribute("play-on-seeked",""),e.player.pause())}}),a(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,a=n.getAttribute("seek-value");i.empty(a)&&(a=n.value),n.removeAttribute("seek-value"),e.player.currentTime=a/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!i.element(this.player.elements.display.duration)&&a(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,X.timeUpdate.call(e.player))}),a(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),q.isWebkit&&a(E.call(this.player,'input[type="range"]'),"input",function(t){X.updateRangeFill.call(e.player,t.target)}),a(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return X.updateSeekTooltip.call(e.player,t)}),a(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),a(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),a(this.player.elements.controls,"focusin focusout",function(t){var i=e.player,n=i.config,a=i.elements,s=i.timers;if(T(a.controls,n.classNames.noTransition,"focusin"===t.type),de.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){T(a.controls,n.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return de.toggleControls.call(e.player,!1)},r)}}),a(this.player.elements.inputs.volume,"wheel",function(t){var i=t.webkitDirectionInvertedFromDevice,n=0;(t.deltaY<0||t.deltaX>0)&&(i?(e.player.decreaseVolume(.02),n=-1):(e.player.increaseVolume(.02),n=1)),(t.deltaY>0||t.deltaX<0)&&(i?(e.player.increaseVolume(.02),n=1):(e.player.decreaseVolume(.02),n=-1)),(1===n&&e.player.media.volume<1||-1===n&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}}]),e}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var he,me=(function(e,t){var i;i=function(){var e=function(){},t={},i={},n={};function a(e,t){if(e){var a=n[e];if(i[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function r(t,i,n,a){var s,l,o=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,p=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(l=o.createElement("link")).rel="stylesheet",l.href=p):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(l=o.createElement("img")).src=p:((l=o.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var o=e.type[0];if(s&&"hideFocus"in l)try{l.sheet.cssText.length||(o="e")}catch(e){o="e"}if("e"==o&&(a+=1)<u)return r(t,i,n,a);i(t,o,e.defaultPrevented)},!1!==d(t,l)&&o.head.appendChild(l)}function l(e,i,n){var l,o;if(i&&i.trim&&(l=i),o=(l?n:i)||{},l){if(l in t)throw"LoadJS";t[l]=!0}!function(e,t,i){var n,a,s=(e=e.push?e:[e]).length,l=s,o=[];for(n=function(e,i,n){if("e"==i&&o.push(e),"b"==i){if(!n)return;o.push(e)}--s||t(o)},a=0;a<l;a++)r(e[a],n,i)}(e,function(e){s(o,e),a(l,e)},o)}return l.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,r,l=[],o=e.length,c=o;for(a=function(e,i){i.length&&l.push(e),--c||t(l)};o--;)s=e[o],(r=i[s])?a(s,r):(n[s]=n[s]||[]).push(a)}(e,function(e){s(t,e)}),l},l.done=function(e){a(e,[])},l.reset=function(){t={},i={},n={}},l.isDefined=function(e){return e in t},l},e.exports=i()}(he={exports:{}},he.exports),he.exports);function fe(e){return new Promise(function(t,i){me(e,{success:t,error:i})})}function ge(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,o.call(this,this.media,e?"play":"pause"))}var ye={setup:function(){var e=this;T(this.elements.wrapper,this.config.classNames.embed,!0),ye.setAspectRatio.call(this),i.object(window.Vimeo)?ye.ready.call(this):fe(this.config.urls.vimeo.sdk).then(function(){ye.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=i.string(e)?e.split(":"):this.config.ratio.split(":"),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var a=(240-n)/4.8;this.media.style.transform="translateY(-"+a+"%)"}},ready:function(){var e=this,t=this,n=ee({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),a=t.media.getAttribute("src");i.empty(a)&&(a=t.media.getAttribute(t.config.attributes.embed.id));var s,r=(s=a,i.empty(s)?null:i.number(Number(s))?s:s.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:s),l=f("iframe"),c=V(t.config.urls.vimeo.iframe,r,n);l.setAttribute("src",c),l.setAttribute("allowfullscreen",""),l.setAttribute("allowtransparency",""),l.setAttribute("allow","autoplay");var u=f("div",{class:t.config.classNames.embedContainer});u.appendChild(l),t.media=b(u,t.media),G(V(t.config.urls.vimeo.api,r),"json").then(function(e){if(!i.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",de.setPoster.call(t,n.href)}}),t.embed=new window.Vimeo.Player(l,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return ge.call(t,!0),t.embed.play()},t.media.pause=function(){return ge.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var d=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return d},set:function(e){var i=t.embed,n=t.media,a=t.paused,s=t.volume,r=a&&!i.hasPlayed;n.seeking=!0,o.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(function(){return i.setCurrentTime(e)}).then(function(){return r&&i.pause()}).then(function(){return r&&i.setVolume(s)}).catch(function(){})}});var p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then(function(){p=e,o.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&X.setSpeedMenu.call(t,[])})}});var h=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return h},set:function(e){t.embed.setVolume(e).then(function(){h=e,o.call(t,t.media,"volumechange")})}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!i.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){m=n,o.call(t,t.media,"volumechange")})}});var g=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return g},set:function(e){var n=i.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){g=n})}});var y=void 0;t.embed.getVideoUrl().then(function(e){y=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return y}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var i=function(e,t){var i=function e(t,i){return 0===i?t:e(i,t%i)}(e,t);return e/i+":"+t/i}(t[0],t[1]);ye.setAspectRatio.call(e,i)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(i){t.config.title=i,de.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){d=e,o.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,o.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,te.setup.call(t)}),t.embed.on("cuechange",function(e){var i=e.cues,n=(void 0===i?[]:i).map(function(e){return t=e.text,i=document.createDocumentFragment(),n=document.createElement("div"),i.appendChild(n),n.innerHTML=t,i.firstChild.innerText;var t,i,n});te.updateCues.call(t,n)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){ge.call(t,!e),e||o.call(t,t.media,"playing")}),i.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){ge.call(t,!0),o.call(t,t.media,"playing")}),t.embed.on("pause",function(){ge.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,d=e.seconds,o.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,o.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&o.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,o.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,o.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,o.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,o.call(t,t.media,"error")}),setTimeout(function(){return de.build.call(t)},0)}};function ve(e){var t=Object.entries({hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144}).find(function(t){return t.includes(e)});return t?t.find(function(t){return t!==e}):"default"}function be(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,o.call(this,this.media,e?"play":"pause"))}var ke,we={setup:function(){var e=this;T(this.elements.wrapper,this.config.classNames.embed,!0),we.setAspectRatio.call(this),i.object(window.YT)&&i.function(window.YT.Player)?we.ready.call(this):(fe(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){we.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(i.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(i.empty(n))return this.config.title=n,void de.setTitle.call(this)}var a=this.config.keys.google;i.string(a)&&!i.empty(a)&&G(V(this.config.urls.youtube.api,e,a)).then(function(e){i.object(e)&&(t.config.title=e.items[0].snippet.title,de.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(i.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");i.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var a,s=(a=n,i.empty(a)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a),r=e.provider+"-"+Math.floor(1e4*Math.random()),l=f("div",{id:r});e.media=b(l,e.media);var c=function(e){return"https://img.youtube.com/vi/"+s+"/"+e+"default.jpg"};ue(c("maxres"),121).catch(function(){return ue(c("sd"),121)}).catch(function(){return ue(c("hq"))}).then(function(t){return de.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(r,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!i.object(e.media.error)){var n={code:t.data};switch(t.data){case 2:n.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:n.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:n.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:n.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:n.message="An unknown error occured"}e.media.error=n,o.call(e,e.media,"error")}},onPlaybackQualityChange:function(){o.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),o.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;we.getTitle.call(e,s),e.media.play=function(){be.call(e,!0),n.playVideo()},e.media.pause=function(){be.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,o.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return ve(n.getPlaybackQuality())},set:function(e){n.setPlaybackQuality(ve(e))}});var a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,n.setVolume(100*a),o.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var a=i.boolean(t)?t:r;r=a,n[a?"mute":"unMute"](),o.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),o.call(e,e.media,"timeupdate"),o.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&o.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),o.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return de.build.call(e)},50)},onStateChange:function(t){var n,a=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,o.call(e,e.media,"seeked")),t.data){case-1:o.call(e,e.media,"timeupdate"),e.media.buffered=a.getVideoLoadedFraction(),o.call(e,e.media,"progress");break;case 0:be.call(e,!1),e.media.loop?(a.stopVideo(),a.playVideo()):o.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(be.call(e,!0),o.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){o.call(e,e.media,"timeupdate")},50),e.media.duration!==a.getDuration()&&(e.media.duration=a.getDuration(),o.call(e,e.media,"durationchange")),X.setQualityMenu.call(e,(n=a.getAvailableQualityLevels(),i.empty(n)?n:z(n.map(function(e){return ve(e)})))));break;case 2:e.muted||e.embed.unMute(),be.call(e,!1)}o.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Te={setup:function(){if(this.media)if(T(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),T(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&T(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=f("div",{class:this.config.classNames.video}),h(this.media,this.elements.wrapper),this.elements.poster=f("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":we.setup.call(this);break;case"vimeo":ye.setup.call(this)}else this.isHTML5&&O.extend.call(this);else this.debug.warn("No media element found!")}},Ae=function(){function e(t){var i=this;c(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){i.on("loaded",e),i.on("error",t)}),this.load()}return u(e,[{key:"load",value:function(){var e=this;this.enabled&&(i.object(window.google)&&i.object(window.google.ima)?this.ready():fe(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=f("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var i=new google.ima.AdsRequest;i.adTagUrl=this.tagUrl,i.linearAdSlotWidth=t.offsetWidth,i.linearAdSlotHeight=t.offsetHeight,i.nonLinearAdSlotWidth=t.offsetWidth,i.nonLinearAdSlotHeight=t.offsetHeight,i.forceNonLinearFullSlot=!1,i.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(i)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=$(Math.max(e.manager.getRemainingTime(),0)),i=U("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",i)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),i.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(i.element(n)){var a=100/t.player.duration*e,s=f("span",{class:t.player.config.classNames.cues});s.style.left=a.toString()+"%",n.appendChild(s)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),a=function(e){var i="ads"+e.replace(/_/g,"").toLowerCase();o.call(t.player,t.player.media,i)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:a(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:a(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:a(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:a(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;i.empty(e.cuePoints)||e.cuePoints.forEach(function(i,a){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,a=Array(n>1?n-1:0),s=1;s<n;s++)a[s-1]=arguments[s];var r=this.events[e];i.array(r)&&r.forEach(function(e){i.function(e)&&e.apply(t,a)})}},{key:"on",value:function(e,t){return i.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var i=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){i.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!i.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+ee({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),Ce={insertElements:function(e,t){var n=this;i.string(t)?g(e,this.media,{src:t}):i.array(t)&&t.forEach(function(t){g(e,n.media,t)})},change:function(e){var t=this;i.object(e)&&"sources"in e&&e.sources.length?(O.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],y(t.media),t.media=null,i.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=i.empty(e.sources[0].provider)?ne.html5:e.sources[0].provider,t.supported=j.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=f("video");break;case"html5:audio":t.media=f("audio");break;case"youtube:video":case"vimeo:video":t.media=f("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),i.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),i.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),de.addStyleHook.call(t),t.isHTML5&&Ce.insertElements.call(t,"source",e.sources),t.config.title=e.title,Te.setup.call(t),t.isHTML5&&("tracks"in e&&Ce.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&de.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Ee=function(){function e(t,n){var a=this;if(c(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=j.touch,this.media=t,i.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||i.nodeList(this.media)||i.array(this.media))&&(this.media=this.media[0]),this.config=R({},ie,e.defaults,n||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new re(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",j),!i.nullOrUndefined(this.media)&&i.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(j.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var l=this.media.tagName.toLowerCase(),o=null,u=null;switch(l){case"div":if(o=this.media.querySelector("iframe"),i.element(o)){if(u=Z(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?ne.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ne.vimeo:null}(u.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",u.searchParams.length){var d=["1","true"];d.includes(u.searchParams.get("autoplay"))&&(this.config.autoplay=!0),d.includes(u.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=d.includes(u.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(i.empty(this.provider)||!Object.keys(ne).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=ae.video;break;case"video":case"audio":this.type=l,this.provider=ne.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=j.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new pe(this),this.storage=new W(this),this.media.plyr=this,i.element(this.elements.container)||(this.elements.container=f("div"),h(this.media,this.elements.container)),this.elements.container.setAttribute("tabindex",0),de.addStyleHook.call(this),Te.setup.call(this),this.config.debug&&s.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&de.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new ce(this),this.ads=new Ae(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return u(e,[{key:"play",value:function(){return i.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&i.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(i.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):i.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(i.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(i.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(i.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(i.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=i.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);N(this.elements.buttons.captions,t),T(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,o.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){j.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=A(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,a=T(this.elements.container,this.config.classNames.hideControls,n);if(a&&this.config.controls.includes("settings")&&!i.empty(this.config.settings)&&X.toggleMenu.call(this,!1),a!==t){var s=a?"controlshidden":"controlsshown";o.call(this,this.media,s)}return!a}return!1}},{key:"on",value:function(e,t){s.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){l(this.elements.container,e,t)}},{key:"off",value:function(e,t){r(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var a=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(y(t.elements.buttons.play),y(t.elements.captions),y(t.elements.controls),y(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),i.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.elements,i=e.type,n=e.callback,a=e.options;t.removeEventListener(i,n,a)}),this.eventListeners=[])}.call(t),b(t.elements.original,t.elements.container),o.call(t,t.elements.original,"destroyed",!0),i.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),de.toggleNativeControls.call(this,!0),a();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&i.function(this.embed.destroy)&&this.embed.destroy(),a();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(a),setTimeout(a,200)}}}},{key:"supports",value:function(e){return j.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===ne.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===ne.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===ne.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===ae.video)}},{key:"isAudio",get:function(){return Boolean(this.type===ae.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=i.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return i.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;i.string(t)&&(t=Number(t)),i.number(t)||(t=this.storage.get("volume")),i.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!i.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;i.boolean(t)||(t=this.storage.get("muted")),i.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;i.number(e)&&(t=e),i.number(t)||(t=this.storage.get("speed")),i.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var a=[!i.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(i.number);if(!n.includes(a)){var s=function(e,t){return i.array(e)&&e.length?e.reduce(function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e}):null}(n,a);this.debug.warn("Unsupported quality option: "+a+", using "+s+" instead"),a=s}o.call(this,this.media,"qualityrequested",!1,{quality:a}),t.selected=a,this.media.quality=a}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=i.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){Ce.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?de.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=i.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){te.set.call(this,e)},get:function(){var e=this.captions,t=e.active,i=e.currentTrack;return t?i:-1}},{key:"language",set:function(e){te.setLanguage.call(this,e)},get:function(){return(te.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(j.pip){var a=i.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(a?t:n)}},get:function(){return j.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,i){return j.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return K(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null;return i.string(t)?a=Array.from(document.querySelectorAll(t)):i.nodeList(t)?a=Array.from(t):i.array(t)&&(a=t.filter(i.element)),i.empty(a)?null:a.map(function(t){return new e(t,n)})}}]),e}();return Ee.defaults=(ke=ie,JSON.parse(JSON.stringify(ke))),Ee}); //# sourceMappingURL=plyr.min.js.map diff --git a/dist/plyr.min.js.map b/dist/plyr.min.js.map index c56fe2a6..35d03557 100644 --- a/dist/plyr.min.js.map +++ b/dist/plyr.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","utils/arrays.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","storage.js","utils/time.js","controls.js","utils/loadSprite.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","arguments","undefined","passive","capture","empty","function","from","forEach","element","Node","call","events","split","type","on","off","trigger","bubbles","detail","CustomEvent","assign","this","dispatchEvent","wrap","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","key","_ref2","value","setAttribute","createElement","text","document","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","toggleState","target","pressed","getAttribute","state","transitionEndEvent","find","style","range","browser","documentMode","documentElement","navigator","userAgent","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","matchMedia","dedupe","filter","item","indexOf","html5","sources","getSources","sizes","source","map","player","mime","currentTime","playing","src","onLoadedMetaData","load","play","config","blankVideo","debug","log","extend","_len","_key","shift","concat","format","args","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","reduce","obj","seekTime","title","Storage","enabled","storage","store","localStorage","getItem","json","JSON","parse","get","setItem","stringify","removeItem","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","cors","URL","iconUrl","location","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","getIconUrl","iconPath","url","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","push","updateRangeFill","suffix","list","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","current","max","toFixed","_this","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","sort","a","b","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","bind","speed","isVimeo","_this5","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","getElementById","transitions","reducedMotion","size","getTabSize","restore","propertyName","focus","data","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","hasId","exists","update","insertAdjacentElement","useStorage","cached","prefix","content","then","result","catch","Math","floor","random","props","create","_ref3","findElements","offsetHeight","labels","join","_this7","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","blob","createObjectURL","userLanguage","setLanguage","trackEvents","_captions","meta","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","caption","defaults","providers","types","noop","Console","console","onChange","isIos","focusable","first","last","trap","keyCode","shiftKey","preventDefault","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","defaultPrevented","head","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","reset","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","vimeo","setAspectRatio","Vimeo","urls","sdk","ratio","padding","paddingBottom","offset","transform","autoplay","$2","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","fragment","createDocumentFragment","firstChild","getPaused","seconds","build","mapQualityUnit","youtube","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","format$$1","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","init","start","adError","zIndex","_this10","destroy","handlers","apply","_this11","base","Date","now","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","getProviderByUrl","searchParams","truthy","step","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","abs","closest","change","states","webkitPresentationMode","inline","t"],"mappings":"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BwN,EAAU1Y,EAAc,OAAQc,EAA0BrC,KAAKgI,OAAO+D,UAAUkO,YAC9EzQ,UAAYyM,OACf1X,SAASkO,SAAS5L,YAAYoZ,KAG3B5a,KAAKW,KAAMA,KAAKwG,MAAO,wBA1B1B0B,MAAMoF,KAAK,4BAA6BrR,aANxCiM,MAAMoF,KAAK,sCCtPtB4M,aAEO,QAGF,UAGA,YAGG,aAGC,WAGD,UAGF,SACD,WAGG,sBAIO,cAGL,gBAGE,QAGP,oBAGM,gBAGC,cAGF,sBAGQ,cAGR,aACA,eACH,iDAGG,wDAIC,aAEL,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,0BAMI,mBAOE,WAEN,GACA,IACA,EACA,KACA,IACA,KACA,uBAMK,UACD,uBAKE,QACJ,qBAKE,WACE,eAGF,wBAKC,YACC,aACC,qBAKF,MACJ,kBAKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,cACE,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,iBACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,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","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, false, passive, capture);\n}\n\n// Trigger event\nexport function trigger(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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport { removeElement } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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());\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (is.array(options)) {\n this.options.quality = 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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.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(container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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(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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n trigger.call(this, this.media, 'languagechange');\n }\n\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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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 trigger.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n on(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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 trigger.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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, toggleListener, trigger } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on(this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on(this.player.media, 'loadeddata canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n trigger.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n trigger.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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n trigger.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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 trigger.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n trigger.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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n trigger.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n trigger.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n trigger.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n trigger.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n trigger.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 trigger.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n trigger.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n trigger.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n trigger.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n trigger.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n trigger.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n trigger.call(player, player.media, 'timeupdate');\n trigger.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n trigger.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n trigger.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n trigger.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n trigger.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n trigger.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n trigger.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n trigger.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n trigger.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n trigger.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n trigger.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, trigger } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadScript';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (!url.searchParams) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!is.empty(input)) {\n quality = Number(input);\n }\n\n if (!is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const value = closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n trigger.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n trigger.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file +{"version":3,"sources":["utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","utils/arrays.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","arguments","undefined","passive","capture","once","empty","function","from","forEach","element","Node","call","events","split","type","_this","eventListeners","push","on","this","off","onceCallback","args","_len","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","dispatchEvent","wrap","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","key","_ref2","value","setAttribute","createElement","text","document","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hidden","hide","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","toggleState","target","pressed","getAttribute","state","transitionEndEvent","find","style","range","browser","documentMode","documentElement","navigator","userAgent","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","matchMedia","html5","filter","source","mime","getSources","map","player","currentTime","playing","src","load","play","config","blankVideo","debug","log","extend","sources","shift","concat","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","reduce","obj","seekTime","title","dedupe","item","indexOf","Storage","enabled","storage","store","localStorage","getItem","json","JSON","parse","get","setItem","stringify","removeItem","loadSprite","url","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","prefix","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","cors","URL","iconUrl","location","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","updateRangeFill","suffix","list","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","current","max","toFixed","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","sort","a","b","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","bind","speed","isVimeo","_this5","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","transitions","reducedMotion","size","getTabSize","propertyName","focus","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","Math","floor","random","props","create","_ref3","findElements","offsetHeight","labels","join","_this7","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","blob","createObjectURL","userLanguage","setLanguage","trackEvents","_captions","meta","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","has","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","caption","defaults","providers","types","noop","Console","console","onChange","isIos","focusable","first","last","trap","keyCode","shiftKey","preventDefault","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","global","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","splice","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","defaultPrevented","head","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","reset","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","vimeo","setAspectRatio","Vimeo","urls","sdk","ratio","padding","paddingBottom","offset","transform","autoplay","$2","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","fragment","createDocumentFragment","firstChild","getPaused","seconds","build","mapQualityUnit","entry","youtube","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","format$$1","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","init","start","adError","zIndex","_this10","destroy","handlers","_this11","base","Date","now","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","getProviderByUrl","searchParams","truthy","step","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","min","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","abs","closest","change","states","webkitPresentationMode","inline","t"],"mappings":"kNAIA,IAAMA,EAAiB,SAAAC,UAAUA,MAAAA,EAAiDA,EAAMC,YAAc,MAEhGC,EAAa,SAACF,EAAOC,UAAgBE,QAAQH,GAASC,GAAeD,aAAiBC,IAEtFG,UAAK,SACAJ,UACID,EAAeC,KAAWK,eAF9B,SAIAL,UACID,EAAeC,KAAWM,SAAWA,OAAOC,MAAMP,WALtD,SAOAA,UACID,EAAeC,KAAWQ,gBAR9B,SAUCR,UACGD,EAAeC,KAAWG,kBAX9B,SAaEH,UACED,EAAeC,KAAWS,gBAd9B,SAgBDT,UACMI,EAAGM,gBAAgBV,IAAUW,MAAMC,QAAQZ,YAjBhD,SAmBCA,UACGE,EAAWF,EAAOa,mBApBtB,SAsBEb,UACEE,EAAWF,EAAOc,mBAvBtB,SAyBCd,UACGE,EAAWF,EAAOe,mBA1BtB,SA4BEf,UACED,EAAeC,KAAWgB,YA7B9B,SA+BDhB,UACKE,EAAWF,EAAOiB,YAhCtB,SAkCHjB,UACOE,EAAWF,EAAOkB,OAAOC,eAAiBjB,EAAWF,EAAOkB,OAAOE,eAnCvE,SAqCDpB,UACKE,EAAWF,EAAOqB,aAAgBjB,EAAGM,gBAAgBV,IAAUI,EAAGkB,OAAOtB,EAAMuB,WAtCnF,SAwCHvB,UACQI,EAAGM,gBAAgBV,IAAU,mFAAmFwB,KAAKxB,oBAzC1H,SA2CSA,UACLA,MAAAA,SA5CJ,SA8CDA,UAEEI,EAAGM,gBAAgBV,KACjBI,EAAGkB,OAAOtB,IAAUI,EAAGqB,MAAMzB,IAAUI,EAAGsB,SAAS1B,MAAYA,EAAM2B,QACtEvB,EAAGwB,OAAO5B,KAAWK,OAAOwB,KAAK7B,GAAO2B,SCjD/CG,EAA4B,eAE1BC,GAAY,UAENC,EAAU3B,OAAO4B,kBAAmB,eAAW,qBAEjC,EACL,eAGRC,iBAAiB,OAAQ,KAAMF,UAC/BG,oBAAoB,OAAQ,KAAMH,GAC3C,MAAOI,WAIFL,EAhBuB,GAoBlC,SAAgBM,EAAeC,EAAUC,EAAOC,OAAUC,EAA+DC,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAA/CE,IAA+CF,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,UAA/BG,EAA+BH,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAAdI,EAAcJ,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,OAEjHtC,EAAG2C,MAAMT,KAAalC,EAAG2C,MAAMR,IAAWnC,EAAG4C,SAASR,MAKtDpC,EAAGsB,SAASY,IAAalC,EAAGqB,MAAMa,SAE5BW,KAAKX,GAAUY,QAAQ,SAAAC,GACrBA,aAAmBC,QACJC,KAAK,KAAMF,EAASZ,EAAOC,EAAUC,EAAQG,EAASC,cAQ3ES,EAASf,EAAMgB,MAAM,KAIvBvB,EAAUa,EAGVf,+BAUGoB,QAAQ,SAAAM,GACPC,GAAQA,EAAKC,gBAAkBjB,IAAWK,KAErCY,eAAeC,MAAOrB,SAAAA,EAAUkB,KAAAA,EAAMhB,SAAAA,EAAUR,QAAAA,MAGhDS,EAAS,mBAAqB,uBAAuBe,EAAMhB,EAAUR,MAKtF,SAAgB4B,EAAGT,OAASG,EAAwDZ,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAA/C,GAAIF,EAA2CE,UAAA,GAAjCE,IAAiCF,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAAjBG,EAAiBH,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,KACjEW,KAAKQ,KAAMV,EAASG,EAAQd,GAAU,EAAMI,EAASC,GAIxE,SAAgBiB,EAAIX,OAASG,EAAwDZ,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAA/C,GAAIF,EAA2CE,UAAA,GAAjCE,IAAiCF,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAAjBG,EAAiBH,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,KAClEW,KAAKQ,KAAMV,EAASG,EAAQd,GAAU,EAAOI,EAASC,GAIzE,SAAgBC,EAAKK,OAASG,EAAwDZ,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAA/C,GAAIF,EAA2CE,UAAA,GAAjCE,IAAiCF,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAAjBG,EAAiBH,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,KAMnES,EAASG,WALfS,MACDZ,EAASG,EAAQS,EAAcnB,EAASC,8BADvBmB,EAAMrD,MAAAsD,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,MAAAA,GAAAxB,UAAAwB,KAElBC,MAAMN,KAAMG,KAGqB,EAAMpB,EAASC,GAAS,GAI1E,SAAgBuB,EAAajB,OAASK,EAAyCd,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAlC,GAAI2B,EAA8B3B,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAAb4B,EAAa5B,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,SAEtEtC,EAAG+C,QAAQA,KAAY/C,EAAG2C,MAAMS,QAK/BjB,EAAQ,IAAIgC,YAAYf,oBAElBnD,OAAOmE,UAAWF,QAChBT,WAKNY,cAAclC,w3BCvG1B,SAAgBmC,EAAKpC,EAAUqC,OAErBC,EAAUtC,EAASX,OAASW,GAAYA,SAIxCW,KAAK2B,GACNC,UACA3B,QAAQ,SAACC,EAAS2B,OACTC,EAAQD,EAAQ,EAAIH,EAAQK,WAAU,GAAQL,EAG9CM,EAAS9B,EAAQ+B,WACjBC,EAAUhC,EAAQiC,cAIlBC,YAAYlC,GAKdgC,IACOG,aAAaP,EAAOI,KAEpBE,YAAYN,KAMnC,SAAgBQ,EAAcpC,EAASqC,GAC9BpF,EAAG+C,QAAQA,KAAY/C,EAAG2C,MAAMyC,WAI9BC,QAAQD,GAAYtC,QAAQ,SAAAwC,gBAC/BC,EAEEC,EAAA,GADFC,EACED,EAAA,KACME,aAAaH,EAAKE,KAKlC,SAAgBE,EAAcvC,EAAMgC,EAAYQ,OAEtC7C,EAAU8C,SAASF,cAAcvC,UAGnCpD,EAAGwB,OAAO4D,MACIrC,EAASqC,GAIvBpF,EAAGkB,OAAO0E,OACFE,UAAYF,GAIjB7C,EASX,SAAgBgD,EAAc3C,EAAMyB,EAAQO,EAAYQ,KAE7CX,YAAYU,EAAcvC,EAAMgC,EAAYQ,IAIvD,SAAgBI,EAAcjD,GACtB/C,EAAGsB,SAASyB,IAAY/C,EAAGqB,MAAM0B,SAC3BF,KAAKE,GAASD,QAAQkD,GAI3BhG,EAAG+C,QAAQA,IAAa/C,EAAG+C,QAAQA,EAAQ+B,eAIxCA,WAAWmB,YAAYlD,GAInC,SAAgBmD,EAAanD,WACnBxB,EAAWwB,EAAQoD,WAAnB5E,OAECA,EAAS,KACJ0E,YAAYlD,EAAQqD,cAClB,EAKlB,SAAgBC,EAAeC,EAAUC,UAChCvG,EAAG+C,QAAQwD,IAAcvG,EAAG+C,QAAQwD,EAASzB,aAAgB9E,EAAG+C,QAAQuD,MAIpExB,WAAW0B,aAAaF,EAAUC,GAEpCD,GALI,KASf,SAAgBG,EAA0BC,EAAKC,OAMtC3G,EAAGkB,OAAOwF,IAAQ1G,EAAG2C,MAAM+D,gBAI1BtB,KACAwB,EAAWD,WAEbxD,MAAM,KAAKL,QAAQ,SAAA+D,OAEbC,EAAWD,EAAEE,OACbC,EAAYF,EAASG,QAAQ,IAAK,IAIlCC,EAHWJ,EAASG,QAAQ,SAAU,IAGrB9D,MAAM,KACvBoC,EAAM2B,EAAM,GACZzB,EAAQyB,EAAM3F,OAAS,EAAI2F,EAAM,GAAGD,QAAQ,QAAS,IAAM,UAGnDH,EAASK,OAAO,QAGrB,IAEGnH,EAAGwB,OAAOoF,IAAa5G,EAAGkB,OAAO0F,EAASQ,WACjCA,OAAT,IAAsBJ,KAGfI,MAAQJ,YAGlB,MAEUK,GAAKP,EAASG,QAAQ,IAAK,cAGrC,MAEU1B,GAAOE,KASvBL,EAIX,SAAgBkC,EAAavE,EAASwE,MAC7BvH,EAAG+C,QAAQA,QAIZyE,EAAOD,EAENvH,EAAGyH,QAAQD,QACJzE,EAAQ2E,aAAa,WAG7BF,IACQ9B,aAAa,SAAU,MAEvBiC,gBAAgB,WAKhC,SAAgBC,EAAY7E,EAASiE,EAAWa,MACxC7H,EAAG+C,QAAQA,GAAU,KACjB+E,EAAS,qBACQ,IAAVD,MACEA,EAAQ,MAAQ,YAGrBE,UAAUD,GAAQd,GACnBjE,EAAQgF,UAAUC,SAAShB,UAG/B,KAIX,SAAgBiB,EAASlF,EAASiE,UACvBhH,EAAG+C,QAAQA,IAAYA,EAAQgF,UAAUC,SAAShB,GAI7D,SAAgBkB,EAAQnF,EAAS+D,OACvBqB,GAAcxH,QAAAA,gBAMJwH,EAAUD,SAAWC,EAAUC,uBAAyBD,EAAUE,oBAAsBF,EAAUG,qCAHvG/H,MAAMsC,KAAKgD,SAAS0C,iBAAiBzB,IAAW0B,SAAS/E,QAKrDR,KAAKF,EAAS+D,GAIjC,SAAgB2B,EAAY3B,UACjBrD,KAAKvB,SAASwG,UAAUH,iBAAiBzB,GAIpD,SAAgB6B,EAAW7B,UAChBrD,KAAKvB,SAASwG,UAAUE,cAAc9B,GAIjD,SAAgB+B,QACRC,EAAUjD,SAASkD,uBAElBD,GAAWA,IAAYjD,SAASmD,KAGvBnD,SAAS+C,cAAc,UAFvB,KA+ClB,SAAgBK,EAAYlG,EAASnD,MAE7BI,EAAGqB,MAAM0B,IAAY/C,EAAGsB,SAASyB,SAC3BF,KAAKE,GAASD,QAAQ,SAAAoG,UAAUD,EAAYC,EAAQtJ,aAKzDI,EAAG+C,QAAQA,QAKVoG,EAAmD,SAAzCpG,EAAQqG,aAAa,gBAC/BC,EAAQrJ,EAAGyH,QAAQ7H,GAASA,GAASuJ,IAGnCzD,aAAa,eAAgB2D,IC1SzC,IACUtG,EAEAG,EAOAE,EAVGkG,GACHvG,EAAU8C,SAASF,cAAc,QAEjCzC,oBACgB,oCACH,4BACF,2CACD,iBAGVE,EAAOnD,OAAOwB,KAAKyB,GAAQqG,KAAK,SAAApH,eAAkCI,IAAzBQ,EAAQyG,MAAMrH,OAEtDnC,EAAGkB,OAAOkC,IAAQF,EAAOE,ICdpC,ICqHcqG,EDrHRC,UAC8B7D,SAAS8D,sBAC/B,qBAAsB9D,SAAS+D,gBAAgBJ,QAAU,OAAOpI,KAAKyI,UAAUC,oBAC/E,kBAAkB1I,KAAKyI,UAAUE,gBACpC,uBAAuB3I,KAAKyI,UAAUE,WCC3CC,SAEK,gBAAiBnE,SAASF,cAAc,eACxC,gBAAiBE,SAASF,cAAc,eAHnC,SAONvC,EAAM6G,EAAUC,OACdC,GAAM,EACNC,GAAK,EACHC,EAAgBX,EAAQY,UAAYJ,GAAeF,EAAQE,mBAEtDD,EAAX,IAAuB7G,OACd,mBACK4G,EAAQO,QACFP,EAAQQ,cAAgBd,EAAQY,UAAYD,aAGvD,mBACKL,EAAQS,QACFT,EAAQQ,qBAGnB,oBACA,iBACK,IACDR,EAAQQ,cAAgBd,EAAQY,UAAYD,sBAI3CL,EAAQS,OAAST,EAAQO,QACnBP,EAAQQ,oCAWnBd,EAAQY,UAAYtK,EAAG4C,SAAS+C,EAAc,SAAS+E,mCAI3D1K,EAAG4C,SAAS9B,OAAO6J,mDAIf,gBAAiB9E,SAASF,cAAc,cAlDzC,SAuDPvC,OACOwH,EAAUnH,KAAVmH,cAICnH,KAAKoH,UAAY7K,EAAG4C,SAASgI,EAAME,oBAC7B,KAIP1H,EAAKoF,SAAS,kBACPoC,EAAME,YAAY1H,GAAM6D,QAAQ,KAAM,OAI7CxD,KAAKsH,eACG3H,OACC,oBACMwH,EAAME,YAAY,oCAAoC7D,QAAQ,KAAM,QAE1E,mBACM2D,EAAME,YAAY,8CAA8C7D,QAAQ,KAAM,QAEpF,mBACM2D,EAAME,YAAY,8BAA8B7D,QAAQ,KAAM,mBAG9D,OAEZ,GAAIxD,KAAKuH,eACJ5H,OACC,oBACMwH,EAAME,YAAY,eAAe7D,QAAQ,KAAM,QAErD,mBACM2D,EAAME,YAAY,8BAA8B7D,QAAQ,KAAM,QAEpE,mBACM2D,EAAME,YAAY,yBAAyB7D,QAAQ,KAAM,mBAGzD,GAGrB,MAAOjF,UACE,SAIJ,cAIC,eAAgB6D,SAASF,cAAc,qBAIzC8D,EAAQ5D,SAASF,cAAc,WAC/BvC,KAAO,QACS,UAAfqG,EAAMrG,YAKV,iBAAkByC,SAAS+D,6BAGE,IAAvBN,gBAIE,eAAgBxI,QAAUA,OAAOmK,WAAW,4BAA4B/C,SChIrFgD,cAAQ,6BAEDzH,KAAKoH,QAIMtK,MAAMsC,KAAKY,KAAKmH,MAAMrC,iBAAiB,WAGxC4C,OAAO,SAAAC,UAAUpB,EAAQqB,KAAKpI,KAAKI,EAAM+H,EAAOhC,aAAa,iCATtE,kBAeC8B,EAAMI,WACRrI,KAAKQ,MACL8H,IAAI,SAAAH,UAAUlL,OAAOkL,EAAOhC,aAAa,WACzC+B,OAAOpL,iBAlBN,cAsBD0D,KAAKoH,aAIJW,EAAS/H,YAGR5B,eAAe2J,EAAOZ,MAAO,eAAW,iBAGvBM,EAAMI,WAAWrI,KAAKuI,GACbL,OAAO,SAAAC,UAAUA,EAAOhC,aAAa,SAAWoC,EAAOJ,SAAzEA,SAHL,UAMKA,GAAUlL,OAAOkL,EAAOhC,aAAa,cAPL,SASvCxJ,OAKMwL,EAHUF,EAAMI,WAAWrI,KAAKuI,GAGfjC,KAAK,SAAA6B,UAAUlL,OAAOkL,EAAOhC,aAAa,WAAaxJ,OAGzEwL,OAKGK,EAAyBD,EAAzBC,YAAaC,EAAYF,EAAZE,UAGdd,MAAMe,IAAMP,EAAOhC,aAAa,SAMhC1G,KAAK,iBAHa,aACd+I,YAAcA,MAKlBb,MAAMgB,OAGTF,KACOG,SAIE5I,KAAKuI,EAAQA,EAAOZ,MAAO,iBAAiB,WAC5ChL,yBAxEf,WAiFD6D,KAAKoH,YAKIK,EAAMI,WAAWrI,KAAKQ,YAK/BmH,MAAMlF,aAAa,MAAOjC,KAAKqI,OAAOC,iBAKtCnB,MAAMgB,YAGNI,MAAMC,IAAI,iCC1FvB,SAAgBC,YAAOhD,EAAyB5G,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,yBAAT6J,EAAS5L,MAAAsD,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,MAAAA,EAAA,GAAAxB,UAAAwB,OACvCqI,EAAQ5K,cACF2H,MAGLkC,EAASe,EAAQC,eAElBpM,EAAGwB,OAAO4J,WAIR3J,KAAK2J,GAAQtI,QAAQ,SAAAyC,GACpBvF,EAAGwB,OAAO4J,EAAO7F,KACZtF,OAAOwB,KAAKyH,GAAQV,SAASjD,WACvBnB,OAAO8E,EAAdrH,KAAyB0D,SAGtB2D,EAAO3D,GAAM6F,EAAO7F,YAEpBnB,OAAO8E,EAAdrH,KAAyB0D,EAAM6F,EAAO7F,OAIvC2G,EAAAA,WAAAA,GAAOhD,GAAPmD,OAAkBF,KAfdjD,ECbf,SAAgBoD,EAAO1M,8BAAUgE,EAAMrD,MAAAsD,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,MAAAA,EAAA,GAAAxB,UAAAwB,UAC/B9D,EAAG2C,MAAM/C,GACFA,EAGJA,EAAM2M,WAAWtF,QAAQ,WAAY,SAACuF,EAAOC,UAAOzM,EAAGkB,OAAO0C,EAAK6I,IAAM7I,EAAK6I,GAAK,KAa9F,SAAgBC,QAAW9M,EAAqC0C,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAA7B,GAAIiH,EAAyBjH,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAlB,GAAI2E,EAAc3E,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAJ,UACjD1C,EAAMqH,QAAQ,IAAI0F,OAAOpD,EAAKgD,WAAWtF,QAAQ,4BAA6B,QAAS,KAAMA,EAAQsF,YAIhH,SAAgBK,WAAwBtK,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAJ,IACnBiK,WAAWtF,QAAQ,SAAU,SAAArB,UAAQA,EAAKuB,OAAO,GAAG0F,cAAgBjH,EAAKkH,OAAO,GAAGC,gBAqBpG,SAAgBC,QACR9L,GADgCoB,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAJ,IACbiK,oBAlBvB,eACQrL,GADiCoB,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAJ,IACdiK,oBAGVG,EAAWxL,EAAQ,IAAK,OAGxBwL,EAAWxL,EAAQ,IAAK,KAM1BwL,IAHEE,EAAY1L,GAGK,IAAK,IAQtB+L,CAAa/L,IAGRiG,OAAO,GAAG4F,cAAgB7L,EAAOgM,MAAM,GAazD,SAAgBC,EAAQpK,OACdwB,EAAUsB,SAASF,cAAc,gBAC/BV,YAAYlC,GACbwB,EAAQ6I,UCxEnB,IAAMC,EAAO,eACL9H,EAAuBjD,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAjB,GAAIwJ,EAAaxJ,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,SACnBtC,EAAG2C,MAAM4C,IAAQvF,EAAG2C,MAAMmJ,SACnB,OFCKtK,EEEZN,GFFYM,EEEKsK,EAAOuB,KAAM9H,EFD1BpC,MAAM,KAAKmK,OAAO,SAACC,EAAKhI,UAAQgI,GAAOA,EAAIhI,IAAM/D,OEGrDxB,EAAG2C,MAAMzB,SACF,OAGL+F,gBACY6E,EAAO0B,mBACV1B,EAAO2B,qBAGfpI,QAAQ4B,GAASnE,QAAQ,SAAAwC,gBAC5BC,EAEEC,EAAA,GADFC,EACED,EAAA,KACOkH,EAAWxL,EAAQqE,EAAKE,KAG9BvE,GCzBf,SAAgBwM,EAAOrM,UACdrB,EAAGqB,MAAMA,GAIPA,EAAM8J,OAAO,SAACwC,EAAMjJ,UAAUrD,EAAMuM,QAAQD,KAAUjJ,IAHlDrD,MCFTwM,EAAAA,sBACUrC,kBACHsC,QAAUtC,EAAOM,OAAOiC,QAAQD,aAChCvI,IAAMiG,EAAOM,OAAOiC,QAAQxI,0CAuBjCA,OACKsI,EAAQlM,YAAc8B,KAAKqK,eACrB,SAGLE,EAAQlN,OAAOmN,aAAaC,QAAQzK,KAAK8B,QAE3CvF,EAAG2C,MAAMqL,UACF,SAGLG,EAAOC,KAAKC,MAAML,UAEjBhO,EAAGkB,OAAOqE,IAAQA,EAAIhE,OAAS4M,EAAK5I,GAAO4I,8BAGlD3M,MAEKqM,EAAQlM,WAAc8B,KAAKqK,SAK3B9N,EAAGwB,OAAOA,QAKXuM,EAAUtK,KAAK6K,MAGftO,EAAG2C,MAAMoL,aAKNA,EAASvM,UAGTyM,aAAaM,QAAQ9K,KAAK8B,IAAK6I,KAAKI,UAAUT,kDAxD3C,iBAAkBjN,eACb,gBAOJmN,aAAaM,QAJP,UAAA,kBAKNN,aAAaQ,WALP,YAON,EACT,MAAOzM,UACE,SAtBb6L,GCCN,SAAwBa,EAAWC,EAAKtH,MAC/BrH,EAAGkB,OAAOyN,QAKTC,EAAQ5O,EAAGkB,OAAOmG,GAGlBwH,EAAS,kBAAsC,OAAhChJ,SAASiJ,eAAezH,IAEvC0H,EAAS,SAACrG,EAAWsG,KACb5B,UAAY4B,EAGlBJ,GAASC,cAKJ7F,KAAKiG,sBAAsB,aAAcvG,QAIjDkG,IAAUC,IAAU,KACfK,EAAarB,EAAQlM,UAGrB+G,EAAY7C,SAASF,cAAc,YAC/BD,aAAa,SAAU,IAE7BkJ,KACUlJ,aAAa,KAAM2B,GAI7B6H,EAAY,KACNC,EAASrO,OAAOmN,aAAaC,QAAWkB,SAAU/H,MAClC,OAAX8H,EAEG,KACJH,EAAOZ,KAAKC,MAAMc,KACjBzG,EAAWsG,EAAKK,gBAKzBV,GACDW,KAAK,SAAAC,GACEvP,EAAG2C,MAAM4M,KAITL,UACOjB,aAAaM,QACba,SAAU/H,EACb+G,KAAKI,mBACQe,OAKd7G,EAAW6G,MAErBC,MAAM,gBCjEnB,IAAaC,EAAW,SAAAhK,UAASiK,SAAUjK,EAAQ,GAAK,GAAM,GAAI,KACrDkK,EAAa,SAAAlK,UAASiK,SAAUjK,EAAQ,GAAM,GAAI,KAClDmK,EAAa,SAAAnK,UAASiK,SAASjK,EAAQ,GAAI,KAGxD,SAAgBoK,QAAWC,EAAkDxN,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAA3C,EAAGyN,EAAwCzN,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAAlB0N,EAAkB1N,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,OAEpEtC,EAAGiQ,OAAOH,UACJD,EAAW,KAAME,EAAcC,OAIpC1D,EAAS,SAAA7G,UAAS,IAAIA,GAAQyH,OAAO,IAGvCgD,EAAQT,EAASK,GACfK,EAAOR,EAAWG,GAClBM,EAAOR,EAAWE,UAGpBC,GAAgBG,EAAQ,KACxB,MAEQ,IAIFF,EAAW,IAAM,IAAKE,EAAQ5D,EAAO6D,GAA/C,IAAwD7D,EAAO8D,GCfnE,IAAMC,cAAW,eAIHC,EADM,IAAIC,IAAI9M,KAAKqI,OAAO0E,QAAS1P,OAAO2P,UAC/BC,OAAS5P,OAAO2P,SAASC,MAAShH,EAAQiH,OAAS7P,OAAO8P,yBAGlEnN,KAAKqI,OAAO0E,8BAPZ,2BAgBAtO,SAASmO,SAAW1H,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUR,SAAS9L,cAGzErC,SAAS4O,cACJrI,EAAYxF,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQjF,YACpDlD,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQC,eAClDpI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQE,gBACrDrI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQG,oBAC/CtI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQI,kBAC3DvI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQK,UACrDxI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQM,aAChDzI,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQO,kBACnD1I,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQQ,mBACpD3I,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQS,qBAClD5I,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUC,QAAQU,kBAI/DtP,SAASuP,SAAW9I,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUY,eAGhEvP,SAASwP,aACJ/I,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUa,OAAOC,aACjDhJ,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUa,OAAOE,cAI1D1P,SAAS2P,gBACFlJ,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUgB,QAAQC,oBAC/CnJ,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUgB,QAAQpG,sBACvD9C,EAAW1F,KAAKQ,KAAMA,KAAKqI,OAAO+E,UAAUgB,QAAQE,WAI9D/R,EAAG+C,QAAQU,KAAKvB,SAASuP,iBACpBvP,SAAS2P,QAAQG,YAAcvO,KAAKvB,SAASuP,SAAS7I,cAAvB,IAAyCnF,KAAKqI,OAAOmG,WAAWC,WAGjG,EACT,MAAOC,eAEAnG,MAAMoG,KAAK,kEAAmED,QAG9EE,sBAAqB,IAEnB,eA9DF,SAmEFjP,EAAMgC,OAEPoL,EAAUH,EAASiC,WAAWrP,KAAKQ,MACnC8O,GAAe/B,EAAQF,KAAqB,GAAdE,EAAQ7B,KAAtC,IAAkDlL,KAAKqI,OAAO0G,WAG9DC,EAAO5M,SAAS6M,gBALJ,6BAK+B,SAE7CD,EACAvG,EAAO9G,QACG,yBACK,eAKbuN,EAAM9M,SAAS6M,gBAfH,6BAe8B,OAC1CE,EAAUL,EAAV,IAAsBnP,QAKxB,SAAUuP,IACNE,eAAe,+BAAgC,OAAQD,KAEvDC,eAAe,+BAAgC,aAAcD,KAIhE3N,YAAY0N,GAEVF,eAlGE,SAsGDrP,EAAM0P,OACVlN,EAAOyH,EAASjK,EAAMK,KAAKqI,QACzB1G,EAAanF,OAAOmE,UAAW0O,UAE7B1P,OACC,QACM,gBAGN,YACM,gBAOX,UAAWgC,IACAgC,OAAX,IAAwB3D,KAAKqI,OAAOmG,WAAW1K,SAEpCH,MAAQ3D,KAAKqI,OAAOmG,WAAW1K,OAGvC5B,EAAc,OAAQP,EAAYQ,gBA7HhC,SAiIDA,MACJ5F,EAAG2C,MAAMiD,UACF,SAGLmN,EAAQpN,EAAc,cACjBlC,KAAKqI,OAAOmG,WAAWe,KAAKvN,iBAGjCR,YACFU,EACI,cAEWlC,KAAKqI,OAAOmG,WAAWe,KAAKD,OAEvCnN,IAIDmN,gBApJE,SAwJAE,EAAYH,OACfI,EAASvN,EAAc,UACvBP,EAAanF,OAAOmE,UAAW0O,GACjC1P,EAAO4J,EAAYiG,GAEnB5Q,GAAS,EACT8Q,OAAAA,EACAV,OAAAA,EACAW,OAAAA,EACAC,OAAAA,SAEE,SAAUjO,MACDhC,KAAO,UAGlB,UAAWgC,EACPA,EAAWgC,MAAMoB,SAAS/E,KAAKqI,OAAOmG,WAAWqB,aACtClM,OAAX,IAAwB3D,KAAKqI,OAAOmG,WAAWqB,WAGxClM,MAAQ3D,KAAKqI,OAAOmG,WAAWqB,QAItCL,OACC,UACQ,IACD,SACO,UACR,SACO,kBAGb,UACQ,IACD,SACO,WACR,WACO,kBAGb,cACQ,IACD,mBACO,oBACR,iBACO,wBAGb,gBACQ,IACD,oBACO,mBACR,qBACO,4BAGb,eACU7L,OAAX,IAAwB3D,KAAKqI,OAAOmG,WAAWqB,QAA/C,eACO,SACC,SACD,uBAIClQ,IACD6P,SAIX5Q,KAEO4C,YAAYoL,EAASkD,WAAWtQ,KAAKQ,KAAM4P,GAAejM,MAAO,qBACjEnC,YAAYoL,EAASkD,WAAWtQ,KAAKQ,KAAMgP,GAAQrL,MAAO,yBAG1DnC,YAAYoL,EAASmD,YAAYvQ,KAAKQ,KAAM2P,GAAgBhM,MAAO,sBACnEnC,YAAYoL,EAASmD,YAAYvQ,KAAKQ,KAAM0P,GAAS/L,MAAO,0BAGxD,iBAAkB,MAEtBnC,YAAYoL,EAASkD,WAAWtQ,KAAKQ,KAAMgP,MAC3CxN,YAAYoL,EAASmD,YAAYvQ,KAAKQ,KAAM0P,OAIhD/N,EAAYqB,EAA0BhD,KAAKqI,OAAO+E,UAAUC,QAAQ1N,GAAOgC,MAEpE8N,EAAQ9N,GAGT,SAAThC,GACKpD,EAAGqB,MAAMoC,KAAKvB,SAAS4O,QAAQ1N,WAC3BlB,SAAS4O,QAAQ1N,YAGrBlB,SAAS4O,QAAQ1N,GAAMG,KAAK2P,SAE5BhR,SAAS4O,QAAQ1N,GAAQ8P,EAG3BA,eA9PE,SAkQD9P,EAAMgC,OAER+N,EAAQxN,EACV,aAESP,EAAWiC,MACTjC,EAAWiC,GAAlB,eACO5D,KAAKqI,OAAOmG,WAAW1K,QAElC8F,EAASjK,EAAMK,KAAKqI,SAIlBlM,EAAQ+F,EACV,QACAuG,EACIzF,EAA0BhD,KAAKqI,OAAO+E,UAAUa,OAAOtO,UAE7C,YACD,MACA,SACC,UACC,eACO,WAER,2BACgBgC,EAAWiC,GAAjC,yBACiB,kBACA,oBACA,GAErBjC,gBAIHlD,SAASwP,OAAOtO,GAAQxD,IAGpB6T,gBAAgBxQ,KAAKQ,KAAM7D,qCAxS3B,SAiTEwD,EAAMgC,OACXqM,EAAW9L,EACb,WACAuG,EACIzF,EAA0BhD,KAAKqI,OAAO+E,UAAUgB,QAAQzO,SAE/C,MACA,UACE,OACD,8BACS,GAEnBgC,OAKK,WAAThC,EAAmB,GACV6B,YAAYU,EAAc,OAAQ,KAAM,UAE7C+N,EAAS,UACLtQ,OACC,WACQiK,EAAS,SAAU5J,KAAKqI,kBAGhC,WACQuB,EAAS,WAAY5J,KAAKqI,UAOlChG,UAAT,KAA0B4N,EAAO3G,0BAGhC7K,SAAS2P,QAAQzO,GAAQqO,EAEvBA,cAxVE,SA4VFrO,OACDgC,EAAaqB,EAA0BhD,KAAKqI,OAAO+E,UAAUgB,QAAQzO,IAErEsF,EAAY/C,EACd,MACAuG,EAAO9G,uBACkBA,EAAWgC,mBAClBiG,EAASjK,EAAMK,KAAKqI,UAEtC,qBAIC5J,SAAS2P,QAAQzO,GAAQsF,EAEvBA,kBA3WE,SAAApD,OA+WIG,EAA2DH,EAA3DG,MAAOkO,EAAoDrO,EAApDqO,KAAMvQ,EAA8CkC,EAA9ClC,KAAMqK,EAAwCnI,EAAxCmI,UAAOsF,MAAAA,OAAiCxQ,IAAAqR,EAAzB,KAAyBA,MAAnBC,QAAAA,OAAmBtR,IAAAuR,GAAAA,EAClEnG,EAAOhI,EAAc,MAErBwN,EAAQxN,EAAc,eACjBlC,KAAKqI,OAAOmG,WAAWqB,UAG5BS,EAAQpO,EACV,QACAuG,EAAOzF,EAA0BhD,KAAKqI,OAAO+E,UAAUa,OAAOtO,UACpD,qBACQA,0BAGP,mBAIT4Q,EAAOrO,EAAc,QAAU4B,OAAQ,OAEvCtC,YAAY8O,KACZ9O,YAAY+O,KACZC,mBAAmB,YAAaxG,GAElCzN,EAAG+C,QAAQgQ,MACL9N,YAAY8N,KAGjB9N,YAAYkO,KACZlO,YAAY0I,sBA5YR,eAgZKzE,EAA2C5G,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAlC,KAAMwN,EAA4BxN,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAArB,EAAG0N,EAAkB1N,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,MAEpDtC,EAAG+C,QAAQmG,IAAYlJ,EAAGiQ,OAAOH,QAKhCoE,EAAazE,EAAShM,KAAKsO,UAAY,IAGtCjM,UAAY+J,EAAWC,EAAMoE,EAAYlE,kBA1ZvC,WA+ZJvM,KAAK9B,UAAUyI,KAKhBpK,EAAG+C,QAAQU,KAAKvB,SAASwP,OAAOE,WACvBuC,SAASlR,KAAKQ,KAAMA,KAAKvB,SAASwP,OAAOE,OAAQnO,KAAK2Q,MAAQ,EAAI3Q,KAAKmO,QAIhF5R,EAAG+C,QAAQU,KAAKvB,SAAS4O,QAAQK,SACrB1N,KAAKvB,SAAS4O,QAAQK,KAAM1N,KAAK2Q,OAAyB,IAAhB3Q,KAAKmO,mBA1atD,SA+aJ1I,OAAQzD,EAAWnD,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAH,EAChBtC,EAAG+C,QAAQmG,OAKTzD,MAAQA,IAGNgO,gBAAgBxQ,KAAKQ,KAAMyF,oBAxb3B,SA4bE/G,iBACNsB,KAAK9B,UAAUyI,IAAOpK,EAAGmC,MAAMA,QN3bdkS,EAASC,EM+b3B7O,EAAQ,KAkBRtD,SACQA,EAAMiB,UAEL,iBACA,cACA,SNtdSiR,EMudY5Q,KAAKgI,YNvdR6I,EMudqB7Q,KAAKsO,WNtd7C,IAAZsC,GAAyB,IAARC,GAAapU,OAAOC,MAAMkU,IAAYnU,OAAOC,MAAMmU,GAC7D,GAGHD,EAAUC,EAAM,KAAKC,QAAQ,GMqdF,eAAfpS,EAAMiB,QACG+Q,SAASlR,KAAKQ,KAAMA,KAAKvB,SAASwP,OAAOC,KAAMlM,aAM3D,cACA,YAjCO,SAACyD,EAAQtJ,OACnB6F,EAAQzF,EAAGiQ,OAAOrQ,GAASA,EAAQ,EACnC6R,EAAWzR,EAAG+C,QAAQmG,GAAUA,EAAS7F,EAAKnB,SAAS2P,QAAQC,UAGjE9R,EAAG+C,QAAQ0O,GAAW,GACbhM,MAAQA,MAGX0N,EAAQ1B,EAAS+C,qBAAqB,QAAQ,GAChDxU,EAAG+C,QAAQoQ,OACLhN,WAAW,GAAGsO,UAAYhP,KAuBpBhC,KAAKvB,SAAS2P,QAAQC,OAAwB,IAAhBrO,KAAKiR,6BArelD,SAgfGxL,OAENO,EAAQzJ,EAAGmC,MAAM+G,GAAUA,EAAOA,OAASA,EAG5ClJ,EAAG+C,QAAQ0G,IAAyC,UAA/BA,EAAML,aAAa,YAKvC1D,aAAa,gBAAiB+D,EAAMhE,OAGrCiE,EAAQiL,YAKPnL,MAAMoL,YAAY,UAAcnL,EAAMhE,MAAQgE,EAAM6K,IAAM,IAAhE,yBAlgBS,SAsgBKnS,iBAETsB,KAAKqI,OAAO+I,SAASlD,MAAS3R,EAAG+C,QAAQU,KAAKvB,SAASwP,OAAOC,OAAU3R,EAAG+C,QAAQU,KAAKvB,SAAS2P,QAAQG,cAAkC,IAAlBvO,KAAKsO,cAK/H+C,EAAU,EACRC,EAAatR,KAAKvB,SAASuP,SAASuD,wBACpCC,EAAaxR,KAAKqI,OAAOmG,WAAWC,QAApC,YAEA7P,EAAS,SAAA6S,KACCC,EAAKjT,SAAS2P,QAAQG,YAAaiD,EAAS5S,OAIxDoB,KAAK2R,SACE,WAKPpV,EAAGmC,MAAMA,KACC,IAAM4S,EAAWM,OAASlT,EAAMmT,MAAQP,EAAWQ,UAC1D,CAAA,IAAItN,EAASxE,KAAKvB,SAAS2P,QAAQG,YAAaiD,YACzCO,WAAW/R,KAAKvB,SAAS2P,QAAQG,YAAYxI,MAAM+L,KAAM,IAMnET,EAAU,IACA,EACHA,EAAU,QACP,OAILW,kBAAkBxS,KAAKQ,KAAMA,KAAKvB,SAAS2P,QAAQG,YAAavO,KAAKsO,SAAW,IAAM+C,QAG1F5S,SAAS2P,QAAQG,YAAYxI,MAAM+L,KAAUT,EAAlD,IAII9U,EAAGmC,MAAMA,KACT,aACA,cACFqG,SAASrG,EAAMiB,SACS,eAAfjB,EAAMiB,oBAvjBR,SA4jBFjB,OAEDuT,GAAU1V,EAAG+C,QAAQU,KAAKvB,SAAS2P,QAAQE,WAAatO,KAAKqI,OAAO6J,aAGjEF,kBAAkBxS,KAAKQ,KAAMA,KAAKvB,SAAS2P,QAAQpG,YAAaiK,EAASjS,KAAKsO,SAAWtO,KAAKgI,YAAchI,KAAKgI,YAAaiK,GAGnIvT,GAAwB,eAAfA,EAAMiB,MAAyBK,KAAKmH,MAAMgL,WAK9CC,eAAe5S,KAAKQ,KAAMtB,mBAzkB1B,cA+kBJsB,KAAK9B,UAAUyI,KAAQ3G,KAAKqI,OAAO6J,aAAclS,KAAKgI,kBAKrDqK,EAAc9V,EAAG+C,QAAQU,KAAKvB,SAAS2P,QAAQE,WAGhD+D,GAAerS,KAAKqI,OAAOiK,iBAAmBtS,KAAKuS,UAC3CP,kBAAkBxS,KAAKQ,KAAMA,KAAKvB,SAAS2P,QAAQpG,YAAahI,KAAKsO,UAI9E+D,KACSL,kBAAkBxS,KAAKQ,KAAMA,KAAKvB,SAAS2P,QAAQE,SAAUtO,KAAKsO,YAItEkE,kBAAkBhT,KAAKQ,kBAjmBvB,SAqmBHyS,EAAS7T,KACFoB,KAAKvB,SAASoP,SAAS6E,KAAKD,IAAW7T,mBAtmB3C,SA0mBET,iBAEN5B,EAAG+C,QAAQU,KAAKvB,SAASoP,SAAS8E,MAAMC,cAKvC1C,EAAOlQ,KAAKvB,SAASoP,SAAS8E,MAAMC,QAAQzN,cAAc,MAG5D5I,EAAGqB,MAAMO,UACJA,QAAQyU,QAAU3I,EAAO9L,GAASuJ,OAAO,SAAAkL,UAAWC,EAAKxK,OAAOuK,QAAQzU,QAAQ4G,SAAS6N,UAI5FhU,GAAUrC,EAAG2C,MAAMc,KAAK7B,QAAQyU,UAAY5S,KAAK7B,QAAQyU,QAAQ9U,OAAS,OACvEgV,UAAUtT,KAAKQ,KAVX,UAUuBpB,KAG3BmU,UAAUvT,KAAKQ,MAGnBpB,KAKQsR,QAcR/R,QAAQyU,QACRI,KAAK,SAACC,EAAGC,OACAC,EAAUN,EAAKxK,OAAOuK,QAAQzU,eAC7BgV,EAAQhJ,QAAQ8I,GAAKE,EAAQhJ,QAAQ+I,GAAK,GAAK,IAEzD7T,QAAQ,SAAAuT,KACIQ,eAAe5T,KAAKqT,SAClBD,cA1CN,gBA6CMhG,EAASyG,SAAS7T,KAAKqT,EAAM,UAAWD,SArB1C,SAAAA,OACPlD,EAAQ9F,EAAA,gBAAyBgJ,EAAWC,EAAKxK,eAElDqH,EAAM5R,OAIJ8O,EAAS0G,YAAY9T,KAAKqT,EAAMnD,GAH5B,KAkBI6D,CAASX,SAInBY,cAAchU,KAAKQ,KAlDf,UAkD2BkQ,eAlqB/B,SAsqBJuC,EAASzQ,UACNyQ,OACC,eACgB,IAAVzQ,EAAc4H,EAAS,SAAU5J,KAAKqI,QAAarG,EAAnD,cAEN,aACGzF,EAAGiQ,OAAOxK,GAAQ,KACZ0N,EAAQ9F,EAAA,gBAAyB5H,EAAShC,KAAKqI,eAEhDqH,EAAM5R,OAIJ4R,EAHO1N,EAAV,WAMDmH,EAAYnH,OAElB,kBACM8L,GAASuF,SAAS7T,KAAKQ,qBAGvB,qBA5rBN,SAisBCyS,EAASxN,EAAW9I,OACxBsX,EAAOzT,KAAKvB,SAASoP,SAAS8E,MAAMF,GACtCzQ,EAAQ,KACRkO,EAAOjL,SAEHwN,OACC,aACOzS,KAAK0T,gCAIJnX,EAAG2C,MAAM/C,GAAiB6D,KAAKyS,GAAbtW,EAGvBI,EAAG2C,MAAM8C,OACDhC,KAAKqI,OAAOoK,GAASkB,UAI5BpX,EAAG2C,MAAMc,KAAK7B,QAAQsU,MAAczS,KAAK7B,QAAQsU,GAAS1N,SAAS/C,oBAC/DuG,MAAMoG,KAAX,yBAAyC3M,EAAzC,SAAuDyQ,OAKtDzS,KAAKqI,OAAOoK,GAAStU,QAAQ4G,SAAS/C,oBAClCuG,MAAMoG,KAAX,sBAAsC3M,EAAtC,SAAoDyQ,MAQ3DlW,EAAG+C,QAAQ4Q,OACLuD,GAAQA,EAAKtO,cAAc,OAIjC5I,EAAG+C,QAAQ4Q,IAKFlQ,KAAKvB,SAASoP,SAAS6E,KAAKD,GAAStN,cAArC,IAAuDnF,KAAKqI,OAAOmG,WAAWe,KAAKvN,OAC3F2H,UAAYiD,EAASyG,SAAS7T,KAAKQ,KAAMyS,EAASzQ,OAGlDyD,EAASyK,GAAQA,EAAK/K,cAAL,gBAAmCnD,EAAnC,MAEnBzF,EAAG+C,QAAQmG,OACJ2K,SAAU,qBApvBZ,sBA2yBHF,EAAOlQ,KAAKvB,SAASoP,SAAS8E,MAAM7E,SAAS3I,cAAc,MAC3DyO,EAAS9F,GAAS+F,UAAUrU,KAAKQ,WAG9B8S,UAAUtT,KAAKQ,KALX,WAKuB4T,EAAO9V,UAG9BoS,KAGJ6C,UAAUvT,KAAKQ,MAGnB4T,EAAO9V,YAKNK,EAAUyV,EAAO9L,IAAI,SAACgM,EAAO9R,0BAEtB+R,EAAKjG,SAASkG,QAAUD,EAAKL,eAAiB1R,QAChD8L,GAASuF,SAAS7T,KAAKuU,EAAMD,SAC7BA,EAAMG,UAAYrH,EAAS0G,YAAY9T,KAAKuU,EAAMD,EAAMG,SAAS7K,2BAElE,gBAIF8K,gBACI,WACElU,KAAK8N,SAASkG,aACjBpK,EAAS,WAAY5J,KAAKqI,oBAE3B,eAIFhJ,QAAQuN,EAASwG,eAAee,KAAKnU,SAEpCwT,cAAchU,KAAKQ,KAxCf,WAwC2BkQ,kBAl1B/B,SAs1BA/R,iBAEJ6B,KAAKqI,OAAOuE,SAAS7H,SAAS,aAAgB/E,KAAKqI,OAAOwF,SAAS9I,SAAS,UAK5ExI,EAAG+C,QAAQU,KAAKvB,SAASoP,SAAS8E,MAAMyB,QAOzC7X,EAAGqB,MAAMO,QACJA,QAAQiW,MAAQjW,GACd6B,KAAKoH,SAAWpH,KAAKqU,gBACvBlW,QAAQiW,OACT,GACA,IACA,EACA,KACA,IACA,KACA,SAKHjW,QAAQiW,MAAQpU,KAAK7B,QAAQiW,MAAM1M,OAAO,SAAA0M,UAASE,EAAKjM,OAAO+L,MAAMjW,QAAQ4G,SAASqP,SAGrFxV,GAAUrC,EAAG2C,MAAMc,KAAK7B,QAAQiW,QAAUpU,KAAK7B,QAAQiW,MAAMtW,OAAS,OACnEgV,UAAUtT,KAAKQ,KAtBX,QAsBuBpB,KAG3BmU,UAAUvT,KAAKQ,MAGnBpB,OAKCsR,EAAOlQ,KAAKvB,SAASoP,SAAS8E,MAAMyB,MAAMjP,cAAc,QAGjD+K,QAGR/R,QAAQiW,MAAM/U,QAAQ,SAAA+U,KACdhB,eAAe5T,KAAK8U,SAClBF,cAzCF,cA4CExH,EAASyG,SAAS7T,KAAK8U,EAAM,QAASF,SAI5CZ,cAAchU,KAAKQ,KAhDf,QAgD2BkQ,gBAj5B/B,eAs5BDwC,EAAS1S,KAAKvB,SAASoP,SAAvB6E,KACFlB,GAAWjV,EAAG2C,MAAMwT,IAASlW,OAAO+X,OAAO7B,GAAM8B,KAAK,SAAAC,UAAQA,EAAI3Q,WAE3D9D,KAAKvB,SAASoP,SAAS0B,MAAOiC,eAz5BlC,SA65BF9S,OACCgW,EAAS1U,KAAKvB,SAASoP,SAAvB6G,KACFjF,EAASzP,KAAKvB,SAAS4O,QAAQQ,YAGhCtR,EAAG+C,QAAQoV,IAAUnY,EAAG+C,QAAQmQ,QAI/BkF,EAAOpY,EAAGyH,QAAQtF,GAASA,EAAQnC,EAAG+C,QAAQoV,IAASA,EAAKzQ,aAAa,aAE3E1H,EAAGmC,MAAMA,GAAQ,KACXkW,EAAarY,EAAG+C,QAAQoV,IAASA,EAAKnQ,SAAS7F,EAAM+G,QACrDoP,EAAWnW,EAAM+G,SAAWzF,KAAKvB,SAAS4O,QAAQQ,YAKpD+G,IAAgBA,IAAeC,GAAYF,SAK3CE,KACMC,kBAKVvY,EAAG+C,QAAQmQ,MACJxN,aAAa,gBAAiB0S,GAGrCpY,EAAG+C,QAAQoV,OACEA,GAAOC,KACR3U,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWe,KAAKwF,KAAMJ,GAEnEA,IACKzQ,gBAAgB,cAEhBjC,aAAa,YAAa,iBAr8B9B,SA28BFwS,OACDO,EAAQP,EAAItT,WAAU,KACtB4E,MAAMkP,SAAW,aACjBlP,MAAMmP,QAAU,IAChBhR,gBAAgB,gBAGhB9E,KAAK4V,EAAMlQ,iBAAiB,gBAAgBzF,QAAQ,SAAAlD,OAChDgZ,EAAOhZ,EAAMwJ,aAAa,UAC1B1D,aAAa,OAAWkT,EAA9B,cAIA9T,WAAWG,YAAYwT,OAGrBpD,EAAQoD,EAAMI,YACdC,EAASL,EAAMM,sBAGPN,+BA/9BL,eAw+BLvP,EAAa5G,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAJ,GACL0Q,EAASvP,KAAKvB,SAASoP,SAAvB0B,KACFkE,EAAOrR,SAASiJ,eAAe5F,MAGhClJ,EAAG+C,QAAQmU,IAK4B,aAA9BA,EAAK9N,aAAa,aAO1BiL,EAAUrB,EAAKpK,cAAc,mCAC7BF,EAAY2L,EAAQvP,oBAGpBjC,KAAKmQ,EAAKzK,iBAAL,mBAAyC8L,EAAQjL,aAAa,MAA9D,OAA0EtG,QAAQ,SAAAT,KAClFqD,aAAa,iBAAiB,KAIrCsE,EAAQgP,cAAgBhP,EAAQiP,cAAe,GAErCzP,MAAM6L,MAAWhB,EAAQwE,YAAnC,OACUrP,MAAMsP,OAAYzE,EAAQ0E,aAApC,SAGMG,EAAO7I,EAAS8I,WAAWlW,KAAKQ,KAAMyT,KAmBvCxO,EAAWY,EAhBA,SAAAtH,GAERA,EAAEkH,SAAWR,IACb,QACA,UACFF,SAASxG,EAAEoX,kBAKH5P,MAAM6L,MAAQ,KACd7L,MAAMsP,OAAS,QAQnBtP,MAAM6L,MAAW6D,EAAK7D,MAAhC,OACU7L,MAAMsP,OAAYI,EAAKJ,OAAjC,OAISzE,GAAS,KACd3O,aAAa,YAAa,KAGrBwR,GAAM,OAEbf,EAAO1N,EAAYxF,KAAKQ,KAAjB,mBAA0CyF,EAA1C,YACPrG,KAAKsT,GAAMrT,QAAQ,SAAAoV,KACjBxS,aAAa,iBAAiB,OAEjCiC,gBAAgB,cAGhBY,iBAAiB,2DAA2D,GAAG8Q,iBAhjC3E,SAqjCNrK,iBAEChP,EAAG2C,MAAMc,KAAKqI,OAAOuE,iBACd,SAIL3H,EAAY/C,EAAc,MAAOc,EAA0BhD,KAAKqI,OAAO+E,UAAUR,SAAS9L,aAG5Fd,KAAKqI,OAAOuE,SAAS7H,SAAS,cACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,YAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,aACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,WAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,WACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,SAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,mBACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,iBAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,YAAa,KACrCiJ,EAAW9L,EAAc,MAAOc,EAA0BhD,KAAKqI,OAAO+E,UAAUY,WAGhFE,EAAOtB,EAASkJ,YAAYtW,KAAKQ,KAAM,wBACxBuL,EAAK3H,UAEjBpC,YAAY0M,EAAKwB,SACjBlO,YAAY0M,EAAK/R,SAGjBqF,YAAYoL,EAASmJ,eAAevW,KAAKQ,KAAM,WAKpDA,KAAKqI,OAAO+I,SAASlD,KAAM,KACrBO,EAAUvM,EACZ,cAEWlC,KAAKqI,OAAOmG,WAAWC,SAElC,WAGKjN,YAAYiN,QAChBhQ,SAAS2P,QAAQG,YAAcE,OAGnChQ,SAASuP,SAAWA,IACfxM,YAAYxB,KAAKvB,SAASuP,aAIpChO,KAAKqI,OAAOuE,SAAS7H,SAAS,mBACpBvD,YAAYoL,EAASoJ,WAAWxW,KAAKQ,KAAM,gBAIrDA,KAAKqI,OAAOuE,SAAS7H,SAAS,eACpBvD,YAAYoL,EAASoJ,WAAWxW,KAAKQ,KAAM,aAIrDA,KAAKqI,OAAOuE,SAAS7H,SAAS,WACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,SAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,UAAW,KACnCoJ,EAASjM,EAAc,aAClB,iBAILP,OACG,OACC,UACC3B,KAAKqI,OAAO8F,QAIjBnI,EAAQ4G,EAASkJ,YAAYtW,KAC/BQ,KACA,SACAyI,EAAO9G,qBACgB4J,EAAK3H,QAGzBpC,YAAYwE,EAAM0J,SAClBlO,YAAYwE,EAAM7J,YAEpBsC,SAAS0P,OAASA,IAEb3M,YAAY2M,MAItBnO,KAAKqI,OAAOuE,SAAS7H,SAAS,eACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,aAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,cAAgBxI,EAAG2C,MAAMc,KAAKqI,OAAOwF,UAAW,KACxE0B,EAAOrN,EAAc,aAChB,oBACC,OAGPV,YACDoL,EAASiJ,aAAarW,KAAKQ,KAAM,uCACDuL,EAAK3H,oBAChB,mCACiB2H,EAAK3H,oBACtB,SAInB8Q,EAAOxS,EAAc,cAChB,4CACcqJ,EAAK3H,UAClB,8CACoC2H,EAAK3H,QAC3C,oBACK,IAGTqS,EAAQ/T,EAAc,OAEtBgU,EAAOhU,EAAc,2BACFqJ,EAAK3H,GAA1B,mDAC4C2H,EAAK3H,QAC3C,aAIJ8O,EAAOxQ,EAAc,WACjB,iBAILmG,OAAOwF,SAASxO,QAAQ,SAAAM,OACnB8U,EAAMvS,EAAc,WAChB,aACE,KAGNuN,EAASvN,EACX,SACAuG,EAAOzF,EAA0BmT,EAAK9N,OAAO+E,UAAUC,QAAQQ,gBACrD,eACIsI,EAAK9N,OAAOmG,WAAWqB,QAAjC,IAA4CsG,EAAK9N,OAAOmG,WAAWqB,QAAnE,gCACqBtE,EAAK3H,GAA1B,IAAgCjE,EAAhC,wBACiB,mCACiB4L,EAAK3H,GAAvC,IAA6CjE,mBAC5B,IAErBiK,EAASjK,EAAMwW,EAAK9N,SAGlBrG,EAAQE,EAAc,cACjBiU,EAAK9N,OAAOmG,WAAWe,KAAKvN,UAIjC2H,UAAY4B,EAAK5L,KAEhB6B,YAAYQ,KACfR,YAAYiO,KACXjO,YAAYiT,KAEZhW,SAASoP,SAAS6E,KAAK/S,GAAQ8U,MAGnCjT,YAAYkR,KACXlR,YAAY0U,QAGb7N,OAAOwF,SAASxO,QAAQ,SAAAM,OACnB8T,EAAOvR,EAAc,2BACFqJ,EAAK3H,GAA1B,IAAgCjE,SACxB,uCAC6B4L,EAAK3H,GAA1C,IAAgDjE,EAAhD,YACM,qBACK,IAGTyW,EAAOlU,EACT,eAEU,eACIiU,EAAK9N,OAAOmG,WAAWqB,QAAjC,IAA4CsG,EAAK9N,OAAOmG,WAAWqB,QAAnE,0BACiB,mCACiBtE,EAAK3H,GAAvC,yBACiB,GAErBgG,EAASjK,EAAMwW,EAAK9N,WAGnB7G,YAAY4U,OAEXjY,EAAU+D,EAAc,QAEzBV,YAAYrD,KACXqD,YAAYiS,KAEbhV,SAASoP,SAAS8E,MAAMhT,GAAQ8T,MAGpCjS,YAAYyU,KACZzU,YAAYkT,KACPlT,YAAY+N,QAEjB9Q,SAASoP,SAAS6G,KAAOA,OACzBjW,SAASoP,SAAS0B,KAAOA,SAI9BvP,KAAKqI,OAAOuE,SAAS7H,SAAS,QAAUwB,EAAQoH,OACtCnM,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,QAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,YAAcwB,EAAQqH,WAC1CpM,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,YAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,iBACpBvD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,eAIvDA,KAAKqI,OAAOuE,SAAS7H,SAAS,oBACzBtG,SAASwG,UAAUzD,YAAYoL,EAASiJ,aAAarW,KAAKQ,KAAM,oBAGpEvB,SAASmO,SAAW3H,EAErBjF,KAAKoH,WACIiP,eAAe7W,KAAKQ,KAAMyH,EAAM6O,kBAAkB9W,KAAKQ,SAG3DuW,aAAa/W,KAAKQ,MAEpBiF,UApzCE,yBA0zCLjF,KAAKqI,OAAO4C,WAAY,KAClB+D,EAAOpC,EAASiC,WAAWrP,KAAKQ,MAGlCgP,EAAKnC,QACMmC,EAAK9D,IAAK,oBAKxBtH,GAAK4S,KAAKC,MAAsB,IAAhBD,KAAKE,cAGtBzR,EAAY,UACXxG,SAASmO,SAAW,SAGnB+J,MACE3W,KAAK4D,YACC5D,KAAKqI,OAAO0B,eACf/J,KAAKqI,OAAO2B,OAEnBsB,GAAS,EAET/O,EAAGkB,OAAOuC,KAAKqI,OAAOuE,WAAarQ,EAAG+C,QAAQU,KAAKqI,OAAOuE,YAE9C5M,KAAKqI,OAAOuE,SACjBrQ,EAAG4C,SAASa,KAAKqI,OAAOuE,YAGnB5M,KAAKqI,OAAOuE,SAASpN,KAAKQ,KAAM2W,MAGhC/J,EAASgK,OAAOpX,KAAKQ,SACzBA,KAAK4D,YACC5D,KAAKqI,OAAO0B,eACf/J,KAAKoU,cACHpU,KAAK4S,iBACJ9E,GAASuF,SAAS7T,KAAKQ,WAI5B,OAIPwD,EAAU,SAAArH,OACR2P,EAAS3P,gBAENyF,QAAQ+U,GAAOtX,QAAQ,SAAA0C,gBAC1BD,EAEE+U,EAAA,GADF7U,EACE6U,EAAA,KACO5N,EAAW6C,EAAX,IAAuBhK,EAAvB,IAA+BE,KAGrC8J,GAIPR,IACI/O,EAAGkB,OAAOuC,KAAKqI,OAAOuE,YACVpJ,EAAQyB,GACb1I,EAAG+C,QAAQ2F,OACR0E,UAAYnG,EAAQyB,EAAU0E,iBXt3ChCrK,EW23CZmG,OAAAA,KAGAlJ,EAAGkB,OAAOuC,KAAKqI,OAAO+E,UAAUR,SAAS3H,eAChC7C,SAAS+C,cAAcnF,KAAKqI,OAAO+E,UAAUR,SAAS3H,YAI9D1I,EAAG+C,QAAQmG,OACHzF,KAAKvB,SAASwG,WAIvB1I,EAAG+C,QAAQ2F,KACJzD,YAAYyD,GACZA,KACAuL,mBAAmB,YAAavL,GAItC1I,EAAG+C,QAAQU,KAAKvB,SAASmO,aACjBkK,aAAatX,KAAKQ,MAI3B3C,OAAO+I,UAAUC,UAAUtB,SAAS,UXp5CxBzF,EWq5CJmG,aXp5CL,aACMnG,GAAS,KACdyX,eACKzX,GAAS,IACvB,IWo5CKU,KAAKqI,OAAO+I,SAASxE,SAAU,KACzBoK,EAAShS,EAAYxF,KACvBQ,MAEIA,KAAKqI,OAAO+E,UAAUR,SAAS9L,QAC/B,IACAd,KAAKqI,OAAO+E,UAAU4J,OACtB,KACAhX,KAAKqI,OAAOmG,WAAW1K,QACzBmT,KAAK,WAGL7X,KAAK4X,GAAQ3X,QAAQ,SAAAqQ,KACXA,EAAOwH,EAAK7O,OAAOmG,WAAW1K,QAAQ,KACtC4L,EAAOwH,EAAK7O,OAAOmG,WAAWC,SAAS,KAC7CxM,aAAa,OAAQ,gBC17C3C,SAAwBkV,EAAMjM,OAAKkM,EAAuBvY,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAR,cACvC,IAAIwY,QAAQ,SAACC,EAASC,WAEfC,EAAU,IAAIC,oBAGd,oBAAqBD,YAInBnZ,iBAAiB,OAAQ,cACR,SAAjB+Y,QAEYzM,KAAKC,MAAM4M,EAAQE,eAC7B,MAAOnZ,KACGiZ,EAAQE,qBAGZF,EAAQG,cAIhBtZ,iBAAiB,QAAS,iBACxB,IAAIuZ,MAAMJ,EAAQK,gBAGpB9C,KAAK,MAAO7J,GAAK,KAGjBkM,aAAeA,IAEfU,OACV,MAAOvZ,KACEA,MC3BnB,SAAgBwZ,EAAS5b,OACjB+O,EAAM/O,OAD+B0C,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAG/B,KACAmZ,EAAS5V,SAASF,cAAc,OAC/B+V,KAAO/M,IACR8M,EAAOC,gBAIN,IAAInL,IAAI5B,GACjB,MAAO3M,UACE,MAKf,SAAgB2Z,GAAe/b,OACtBI,EAAGwB,OAAO5B,SACJ,OAGLgc,EAAS,IAAIC,8BAEZxW,QAAQzF,GAAOkD,QAAQ,SAAAwC,gBAC1BC,EAEEC,EAAA,GADFC,EACED,EAAA,KACKsW,IAAIvW,EAAKE,KAGbmW,EC1BX,IAAMrK,UAAW,cAIJ9N,KAAK9B,UAAUyI,OAKf3G,KAAKsH,SAAWtH,KAAKsY,WAActY,KAAKoH,UAAYb,EAAQgS,WAEzDhc,EAAGqB,MAAMoC,KAAKqI,OAAOuE,WAAa5M,KAAKqI,OAAOuE,SAAS7H,SAAS,aAAe/E,KAAKqI,OAAOwF,SAAS9I,SAAS,eACpGyT,gBAAgBhZ,KAAKQ,Wf4C9C,IAA4BV,EAASmG,KerCxBlJ,EAAG+C,QAAQU,KAAKvB,SAASqP,iBACrBrP,SAASqP,SAAW5L,EAAc,MAAOc,EAA0BhD,KAAKqI,OAAO+E,UAAUU,WfoC9ExO,EelCJU,KAAKvB,SAASqP,UfkCDrI,EelCWzF,KAAKvB,SAASqC,SfmCnDO,WAAWI,aAAanC,EAASmG,EAAOlE,ce9BvC0E,EAAQiH,MAAQ7P,OAAOyP,IAAK,KACtBrO,EAAWuB,KAAKmH,MAAMrC,iBAAiB,eAEvC1F,KAAKX,GAAUY,QAAQ,SAAAyU,OACnB5L,EAAM4L,EAAMnO,aAAa,OACzBuF,EAAM6M,EAAS7P,GAET,OAARgD,GAAgBA,EAAIuN,WAAapb,OAAO2P,SAASiL,KAAKQ,WACtD,QACA,UACF1T,SAASmG,EAAIwN,aACLxQ,EAAK,QACN2D,KAAK,SAAA8M,KACI1W,aAAa,MAAO5E,OAAOyP,IAAI8L,gBAAgBD,MAExD5M,MAAM,aACW+H,WAO9BE,EAAShU,KAAKsK,QAAQO,IAAI,YAGzBtO,EAAGyH,QAAQgQ,OACEhU,KAAKqI,OAAOyF,SAAvBkG,YAIHC,EAAWjU,KAAKsK,QAAQO,IAAI,aAAe7K,KAAKqI,OAAOyF,SAASmG,YACnD,SAAbA,EAAqB,QACP7N,UAAU6N,UAAY7N,UAAUyS,cAAcnZ,MAAM,cAD7C,SAIhBoZ,YAAYtZ,KAAKQ,KAAMiU,EAAUD,GAGtChU,KAAKoH,QAAS,KACR2R,EAAc/Y,KAAKqI,OAAOyF,SAASxC,OAAS,uBAAyB,gBACxE9L,KAAKQ,KAAMA,KAAKmH,MAAMoR,WAAYQ,EAAajL,GAASxC,OAAO6I,KAAKnU,kBAIhE8N,GAASxC,OAAO6I,KAAKnU,MAAO,YAxE9B,sBA4EH4T,EAAS9F,GAAS+F,UAAUrU,KAAKQ,MAAM,KAElBA,KAAK8N,SAAxBmG,EAHH+E,EAGG/E,SAAUgF,EAHbD,EAGaC,KAGdjZ,KAAKoH,SAAWpH,KAAKsH,WACdI,OAAO,SAAAoM,UAAUmF,EAAKpO,IAAIiJ,KAAQzU,QAAQ,SAAAyU,KACxCvL,MAAMC,IAAI,cAAesL,KAEzBuE,IAAIvE,WACmB,YAAfA,EAAMoF,SAIbA,KAAO,WAGV1Z,KAAKI,EAAMkU,EAAO,YAAa,kBAAMhG,GAASqL,WAAW3Z,KAAKI,WAInEwZ,GAAgBxF,EAAO9N,KAAK,SAAAgO,UAASA,IAAUlU,EAAKkO,SAASuL,mBAC7DC,EAAatZ,KAAKiU,WAAaA,GAAYL,EAAO9N,KAAK,SAAAgO,UAASA,EAAMG,WAAaA,KAGrFmF,GAAgBE,OACPR,YAAYtZ,KAAKQ,KAAMiU,EAAUjU,KAAKqI,OAAOyF,SAASkG,UAIvDhU,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWV,SAASzD,SAAU9N,EAAG2C,MAAM0U,KAGnF5T,KAAKqI,OAAOuE,cAAgB7H,SAAS,aAAe/E,KAAKqI,OAAOwF,SAAS9I,SAAS,eAC1EyT,gBAAgBhZ,KAAKQ,WA9GzB,SAkHTiB,OAAO6X,IAAiCja,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAAb8V,IAAa9V,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAClC+U,EAAS9F,GAAS+F,UAAUrU,KAAKQ,UAGxB,IAAXiB,KAKC1E,EAAGiQ,OAAOvL,MAKTA,KAAS2S,MAKX5T,KAAK8N,SAAS4F,eAAiBzS,EAAO,MACjC6M,SAAS4F,aAAezS,MACvB6S,EAAQhG,GAASyL,gBAAgB/Z,KAAKQ,MACpCiU,GAAaH,OAAbG,cAGHnG,SAASuL,iBAAmBvF,EAG7BgF,SACKhL,SAASmG,SAAWA,GAIzBjU,KAAKqU,cACAmF,MAAMC,gBAAgBxF,KAIlBzU,KAAKQ,KAAMA,KAAKmH,MAAO,kBAGpCnH,KAAKoH,SAAWpH,KAAKsH,YAEZ6R,WAAW3Z,KAAKQ,MAIzB2U,QACK+E,gBAAe,aAjCfnR,MAAMoG,KAAK,kBAAmB1N,aAL9BsH,MAAMoG,KAAK,2BAA4B1N,aALvCyY,gBAAe,gBAvHf,SAsKDzF,OAAUU,IAAa9V,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,MAC1BtC,EAAGkB,OAAOwW,SAKVnG,SAASmG,SAAWA,EAAS3K,kBAG5BsK,EAAS9F,GAAS+F,UAAUrU,KAAKQ,MACjC8T,EAAQhG,GAASyL,gBAAgB/Z,KAAKQ,MAAM,MACzCqY,IAAI7Y,KAAKQ,KAAM4T,EAAOzJ,QAAQ2J,IAAQ,EAAOa,aAT7CpM,MAAMoG,KAAK,4BAA6BsF,cAxKxC,sBAuLH3I,EAAgBzM,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,UAEP/B,MAAMsC,MAAMY,KAAKmH,WAAaoR,gBAG/B7Q,OAAO,SAAAoM,UAAUpC,EAAKtK,SAAWkE,GAAUoG,EAAK5D,SAASmL,KAAKU,IAAI7F,KAAQpM,OAAO,SAAAoM,UAC3F,WACA,aACF/O,SAAS+O,EAAMpW,yBA/LR,sBAmMGkc,EAAsB/a,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAC5B+U,EAAS9F,GAAS+F,UAAUrU,KAAKQ,MACjC6Z,EAAgB,SAAA/F,UAASrX,QAAQoW,EAAK/E,SAASmL,KAAKpO,IAAIiJ,QAAcH,UACtEmG,EAAShd,MAAMsC,KAAKwU,GAAQZ,KAAK,SAACC,EAAGC,UAAM2G,EAAc3G,GAAK2G,EAAc5G,YACzE2G,GAAgBhG,EAAO5T,KAAK0T,eAAkBoG,EAAOhU,KAAK,SAAAgO,UAASA,EAAMG,WAAapB,EAAK/E,SAASmG,YAAa6F,EAAO,aAvMxH,SA2MJhG,OACDJ,EAAeI,SAEdvX,EAAGuX,MAAMJ,IAAiBnN,EAAQgS,YAAcvY,KAAK8N,SAASkG,WAChDlG,GAASyL,gBAAgB/Z,KAAKQ,OAG7CzD,EAAGuX,MAAMJ,GACJnX,EAAG2C,MAAMwU,EAAahE,OAItBnT,EAAG2C,MAAMwU,EAAaO,UAIpBrK,EAAS,UAAW5J,KAAKqI,QAHrByL,EAAMG,SAAS7K,cAJfsK,EAAahE,MAUrB9F,EAAS,WAAY5J,KAAKqI,oBA9NxB,SAmOFlM,MAEF6D,KAAK9B,UAAUyI,MAIfpK,EAAG+C,QAAQU,KAAKvB,SAASqP,aAMzBvR,EAAGM,gBAAgBV,IAAWW,MAAMC,QAAQZ,QAK7C4d,EAAO5d,MAGN4d,EAAM,KACDjG,EAAQhG,GAASyL,gBAAgB/Z,KAAKQ,QACrClD,MAAMsC,MAAM0U,OAAakG,gBAC3BlS,IAAI,SAAAmS,UAAOA,EAAIC,iBACfpS,IAAI4B,OAIPkC,EAAUmO,EAAKjS,IAAI,SAAAqS,UAAWA,EAAQ7W,SAAQ2T,KAAK,SACzCrL,IAAY5L,KAAKvB,SAASqP,SAASnE,UAEtC,GAEI3J,KAAKvB,SAASqP,cACrBsM,EAAUlY,EAAc,OAAQc,EAA0BhD,KAAKqI,OAAO+E,UAAUgN,YAC9EzQ,UAAYiC,OACfnN,SAASqP,SAAStM,YAAY4Y,KAGtB5a,KAAKQ,KAAMA,KAAKmH,MAAO,wBA1B/BoB,MAAMoG,KAAK,4BAA6BxS,aANxCoM,MAAMoG,KAAK,sCCtPtB0L,aAEO,QAGF,UAGA,YAGG,aAGC,WAGD,UAGF,SACD,WAGG,sBAIO,cAGL,gBAGE,QAGP,oBAGM,gBAGC,cAGF,sBAGQ,cAGR,aACA,eACH,iDAGG,wDAIC,aAEL,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,0BAMI,mBAOE,WAEN,GACA,IACA,EACA,KACA,IACA,KACA,uBAMK,UACD,uBAKE,QACJ,qBAKE,WACE,eAGF,wBAKC,YACC,aACC,qBAKF,MACJ,kBAKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,cACE,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,iBACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,+BACF,+BACF,+BACE,mCAEF,2BACA,0BACD,+BAEI,mDAMP,qBACI,kBACH,4BACA,mCACS,sCACR,6BACO,2BACV,oBACI,wBACA,uBACD,uBACC,wBACA,sBACF,sBACE,qBACH,oBACE,6BACM,4BACP,uBACE,6BACI,6BACC,kCAEH,0BACA,mBACD,qCAGG,gCACD,6CAGC,oCACC,4CAGC,6BACH,uCAGG,iCACH,iCAEF,+CAMI,wBACN,oCAMA,oBAMC,cACI,KC7YRC,UACF,gBACE,gBACF,SAGEC,UACF,cACA,SCRX,IAAMC,GAAO,aAEQC,GAAAA,4BACLpQ,EAAiBxL,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,kBACpBwL,QAAUhN,OAAOqd,SAAWrQ,EAE7BrK,KAAKqK,cACA7B,IAAI,kEAMNxI,KAAKqK,QAAUzN,SAAS8H,UAAUyP,KAAK3U,KAAKkb,QAAQlS,IAAKkS,SAAWF,uCAIpExa,KAAKqK,QAAUzN,SAAS8H,UAAUyP,KAAK3U,KAAKkb,QAAQ/L,KAAM+L,SAAWF,wCAIrExa,KAAKqK,QAAUzN,SAAS8H,UAAUyP,KAAK3U,KAAKkb,QAAQhM,MAAOgM,SAAWF,SAnBhEC,GCIrB,SAASE,QACA3a,KAAKqK,aAKJoF,EAASzP,KAAK+H,OAAOtJ,SAAS4O,QAAQU,WACxCxR,EAAG+C,QAAQmQ,MACCA,EAAQzP,KAAKgU,UAIhBxU,KAAKQ,KAAK+H,OAAQ/H,KAAKyF,OAAQzF,KAAKgU,OAAS,kBAAoB,kBAAkB,GAG3F/N,EAAQ2U,OnBiOjB,eAA0Btb,EAAgCT,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAtB,KAAMD,EAAgBC,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,MACjDtC,EAAG+C,QAAQA,QAIVub,EAAY7V,EAAYxF,KAAKQ,KAAM,2DACnC8a,EAAQD,EAAU,GAClBE,EAAOF,EAAUA,EAAU/c,OAAS,GAEpCkd,EAAO,SAAAtc,MAES,QAAdA,EAAMoD,KAAmC,IAAlBpD,EAAMuc,aAK3B5V,EAAUD,IAEZC,IAAY0V,GAASrc,EAAMwc,SAIpB7V,IAAYyV,GAASpc,EAAMwc,aAE7BtF,UACCuF,qBALAvF,UACAuF,oBAQVvc,IACGoB,KAAKvB,SAASwG,UAAW,UAAW+V,GAAM,KAEzChb,KAAKvB,SAASwG,UAAW,UAAW+V,GAAM,KmBhQpCxb,KAAKQ,KAAK+H,OAAQ/H,KAAKyF,OAAQzF,KAAKgU,SAItD,SAASoH,SAAexc,EAAgBC,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,GAEhCD,OACKyc,kBACEhe,OAAOie,SAAW,IAClBje,OAAOke,SAAW,UAGlBC,SAASxb,KAAKqb,eAAeI,EAAGzb,KAAKqb,eAAeK,YAItDnW,KAAKQ,MAAM4V,SAAW/c,EAAS,SAAW,KAGvCoB,KAAKyF,OAAQzF,KAAK+H,OAAOM,OAAOmG,WAAWT,WAAW6N,SAAUhd,MAGnEY,KAAKQ,UAGZ6b,GAAAA,sBACU9T,6BAEHA,OAASA,OAGT4D,OAASkQ,EAAWlQ,YACpBmQ,SAAWD,EAAWC,cAGtBT,gBAAmBI,EAAG,EAAGC,EAAG,KAI9Blc,KAAKQ,KAAK+H,OAAQ3F,SAA0B,OAAhBpC,KAAK2L,OAAkB,qBAA0B3L,KAAK2L,OAAtD,mBAAgF,cAElGnM,KAAKI,OAIfJ,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOtJ,SAASwG,UAAW,WAAY,SAAAvG,GAEzDnC,EAAG+C,QAAQM,EAAKmI,OAAOtJ,SAASmO,WAAahN,EAAKmI,OAAOtJ,SAASmO,SAASrI,SAAS7F,EAAM+G,WAIzF7G,gBAIJ0M,oDAwEDtL,KAAKqK,aACAtC,OAAOQ,MAAMC,KAAOqT,EAAWE,OAAS,SAAW,YAAxD,4BAEKhU,OAAOQ,MAAMC,IAAI,oDAIdxI,KAAK+H,OAAOtJ,SAASwG,UAAWjF,KAAK+H,OAAOM,OAAOmG,WAAWT,WAAW1D,QAASrK,KAAKqK,yCAK9FrK,KAAKqK,UAKNpE,EAAQ2U,OAAS5a,KAAK+H,OAAOM,OAAO0F,WAAWiO,UAC3Chc,KAAK+H,OAAOE,cACPxC,OAAOwW,wBAERJ,EAAWE,OAEX/b,KAAK2L,OAELpP,EAAG2C,MAAMc,KAAK2L,cACjBlG,OAAUzF,KAAK2L,OAApB,UAAoC3L,KAAK8b,iBAFpCrW,OAAOyW,uBAFG1c,KAAKQ,MAAM,sCAUzBA,KAAKqK,WAKNpE,EAAQ2U,OAAS5a,KAAK+H,OAAOM,OAAO0F,WAAWiO,eAC1CvW,OAAO0W,4BACPpU,OAAOK,YACT,GAAKyT,EAAWE,OAEhB,GAAK/b,KAAK2L,QAEV,IAAKpP,EAAG2C,MAAMc,KAAK2L,QAAS,KACzByQ,EAAyB,QAAhBpc,KAAK2L,OAAmB,SAAW,mBACtC3L,KAAK2L,OAASyQ,EAASpc,KAAK8b,kBAHvC1Z,SAASia,kBAAoBja,SAASka,gBAAgB9c,KAAK4C,kBAF7C5C,KAAKQ,MAAM,oCAWzBA,KAAKgU,YAGDuI,YAFAC,+CAnFJX,EAAWE,QAAU/b,KAAK+H,OAAOM,OAAO0F,WAAW6N,WACpD5b,KAAK+H,OAAOM,OAAO0F,WAAW1D,SAC9BrK,KAAK+H,OAAO7J,UAAUyI,IACtB3G,KAAK+H,OAAOT,+CAMXtH,KAAKqK,UAKLwR,EAAWE,QAIC/b,KAAK2L,OAAsCvJ,SAAAA,GAAYpC,KAAK2L,OAAS3L,KAAK8b,SAA/B,WAA7B1Z,SAASqa,qBAErBzc,KAAKyF,OALbjB,EAASxE,KAAKyF,OAAQzF,KAAK+H,OAAOM,OAAOmG,WAAWT,WAAW6N,iDAUnE3V,EAAQ2U,OAAS5a,KAAK+H,OAAOM,OAAO0F,WAAWiO,UAAYhc,KAAK+H,OAAOZ,MAAQnH,KAAK+H,OAAOtJ,SAASwG,oDA9DjG7C,SAASsa,mBAAqBta,SAASua,yBAA2Bva,SAASwa,sBAAwBxa,SAASya,uDAMlHtgB,EAAG4C,SAASiD,SAASka,sBACd,OAIPta,EAAQ,UAER,SACA,MACA,MAGKwS,KAAK,SAAAsI,YACNvgB,EAAG4C,SAASiD,SAAY0a,EAAZ,qBAAqCvgB,EAAG4C,SAASiD,SAAY0a,EAAZ,0BACrDA,GACD,KAMR9a,yCAIgB,QAAhBhC,KAAK2L,OAAmB,aAAe,mBAlEhDkQ,GC7CN,SAAwBkB,GAAU7U,OAAK8U,EAAcne,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,GAAH,SACvC,IAAIwY,QAAQ,SAACC,EAASC,OACnB0F,EAAQ,IAAIC,MAEZC,EAAU,kBACLF,EAAMG,cACNH,EAAMI,SACZJ,EAAMK,cAAgBN,EAAW1F,EAAUC,GAAQ0F,WAGjDtc,OAAOsc,GAASG,OAAQD,EAASE,QAASF,EAASjV,IAAAA,MCFlE,IAAMvB,iBAAK,aAES3G,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAO+E,UAAUnI,UAAUzB,QAAQ,IAAK,KAAK,KAC3ExD,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAW+O,YAAavd,KAAK9B,UAAUyI,0BAHrF,WAO8B9H,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,IACnBmB,KAAKoH,aACVD,MAAMlF,aAAa,WAAY,SAE/BkF,MAAMjD,gBAAgB,mBAX5B,8BAmBEsZ,UAAUrW,SAGVnH,KAAK9B,UAAUyI,eACX4B,MAAMoG,KAAX,0BAA0C3O,KAAKwG,SAA/C,IAA2DxG,KAAKL,cAG7DiP,qBAAqBpP,KAAKQ,MAAM,GAOlCzD,EAAG+C,QAAQU,KAAKvB,SAASmO,cAEjB6Q,OAAOje,KAAKQ,WAGhBwd,UAAU5Q,eAIhBgC,qBAAqBpP,KAAKQ,MAGzBA,KAAKoH,YACIsW,MAAMle,KAAKQ,WAInBmO,OAAS,UAGTwC,MAAQ,UAGRyD,MAAQ,UAGRuJ,KAAO,UAGP/K,QAAU,OAGNgL,aAAape,KAAKQ,QAGlB6d,WAAWre,KAAKQ,SAGtB8d,aAAate,KAAKQ,QAGTA,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWb,IAAIzP,UAAWqI,EAAQoH,KAAO3N,KAAKoH,SAAWpH,KAAKsH,WAGnGtH,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWZ,QAAQ1P,UAAWqI,EAAQqH,SAAW5N,KAAKoH,WAG3FpH,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWoM,MAAO3U,EAAQ2U,SAG/D5a,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWuP,QAAS/d,KAAK2R,YAGrEqM,OAAQ,aAGF,aACMxe,KAAKI,EAAMA,EAAKuH,MAAO,UACrC,MAGA8W,SAASze,KAAKQ,MAGbA,KAAKke,QAAUle,KAAKvB,SAASyf,SAAWle,KAAKvB,SAASyf,OAAOnY,MAAMoY,oBAChEC,UAAU5e,KAAKQ,KAAMA,KAAKke,QAK7Ble,KAAKqI,OAAOiG,YACH+P,eAAe7e,KAAKQ,gBAxG9B,eA+GC0P,EAAQ9F,EAAS,OAAQ5J,KAAKqI,WAG9B9L,EAAGkB,OAAOuC,KAAKqI,OAAO2B,SAAWzN,EAAG2C,MAAMc,KAAKqI,OAAO2B,iBACxChK,KAAKqI,OAAO2B,WAGrBvL,SAASwG,UAAUhD,aAAa,aAAcjC,KAAKqI,OAAO2B,QAI/DzN,EAAGsB,SAASmC,KAAKvB,SAAS4O,QAAQjF,aAC5BhJ,KAAKY,KAAKvB,SAAS4O,QAAQjF,MAAM/I,QAAQ,SAAAoQ,KACpCxN,aAAa,aAAcyN,KAMtC1P,KAAKse,QAAS,KACRC,EAASrZ,EAAW1F,KAAKQ,KAAM,cAEhCzD,EAAG+C,QAAQif,cAKVvU,EAASzN,EAAG2C,MAAMc,KAAKqI,OAAO2B,OAA6B,QAApBhK,KAAKqI,OAAO2B,MACnDnB,EAASe,EAAS,aAAc5J,KAAKqI,UAEpCpG,aAAa,QAAS4G,EAAOrF,QAAQ,UAAWwG,mBA7IxD,SAkJMwU,KACGxe,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWiQ,cAAeD,cAnJxE,SAuJGN,sBAED/W,MAAMlF,aAAa,SAAUic,IAG7B3hB,EAAG+C,QAAQU,KAAKvB,SAASyf,eACnB7G,QAAQE,aAIbmH,EAAc3B,GAAUmB,GAAQrS,KAAK,oBAClCpN,SAASyf,OAAOnY,MAAMoY,gBAA3B,QAAqDD,EAArD,YACOvd,OAAO+Q,EAAKjT,SAASyf,OAAOnY,+BACNmY,EAAzB,oBAEgB,QAEjBS,aAAanf,KAAKkS,GAAM,GACpBwM,aAICnS,MAAM,kBAAMpF,GAAGgY,aAAanf,KAAKkS,GAAM,KAG5CgN,gBAhLJ,SAoLMhgB,KAEGsB,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWvG,QAASjI,KAAKiI,WAC9DjI,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAW+D,OAAQvS,KAAKuS,UAC7DvS,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWoQ,QAAS5e,KAAK4e,WAG9D5e,KAAKvB,SAAS4O,QAAQjF,KAAMpI,KAAKiI,SAGzC1L,EAAGmC,MAAMA,IAAyB,eAAfA,EAAMiB,SAK1Bkf,eAAerf,KAAKQ,oBAnMpB,SAuMMtB,mBACJogB,SACD,UACA,WACF/Z,SAASrG,EAAMiB,mBAGJK,KAAK+e,OAAOD,cAGpBC,OAAOD,QAAUE,WAAW,aAEjBnM,EAAKpU,SAASwG,UAAW4N,EAAKxK,OAAOmG,WAAWsQ,QAASjM,EAAKiM,YAGvED,eAAerf,KAAKqT,IACxB7S,KAAK8e,QAAU,IAAM,mBAvNrB,SA2NQ1a,OACHwI,EAAa5M,KAAKvB,SAAlBmO,SAEJA,GAAY5M,KAAKqI,OAAO4W,mBAEnBJ,eAAeviB,QAAQ8H,GAASpE,KAAK8e,SAAW9e,KAAKuS,QAAU3F,EAASlH,SAAWkH,EAASsS,UCnOvGC,GAAAA,sBACUpX,kBACHA,OAASA,OACTqX,QAAU,UAEVC,UAAYrf,KAAKqf,UAAUlL,KAAKnU,WAChCsf,WAAatf,KAAKsf,WAAWnL,KAAKnU,WAClCuf,WAAavf,KAAKuf,WAAWpL,KAAKnU,kDAIjCtB,cACA8gB,EAAO9gB,EAAMuc,QAAUvc,EAAMuc,QAAUvc,EAAM+gB,MAC7C/Z,EAAyB,YAAfhH,EAAMiB,KAChB+f,EAASha,GAAW8Z,IAASxf,KAAKof,aAGpC1gB,EAAMihB,QAAUjhB,EAAMkhB,SAAWlhB,EAAMmhB,SAAWnhB,EAAMwc,WAMvD3e,EAAGiQ,OAAOgT,OAYX9Z,EAAS,KA6BHL,EAAUD,OACZ7I,EAAG+C,QAAQ+F,IACXA,IAAYrF,KAAK+H,OAAOtJ,SAASwP,OAAOC,MACxCzJ,EAAQY,EAASrF,KAAK+H,OAAOM,OAAO+E,UAAU0S,yBA7B9C,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAee/a,SAASya,OAClBrE,mBACArG,mBAGF0K,QACC,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,GAEIE,MA5DR3X,OAAOC,YAAcpI,EAAKmI,OAAOuG,SAAW,IAAMkR,EAAO,gBAiErD,QACA,GAEIE,QACI3X,OAAOgY,wBAIf,QAEIhY,OAAOiY,eAAe,eAG1B,QAEIjY,OAAOkY,eAAe,eAG1B,GAEIP,SACI3X,OAAO4I,OAAS3Q,KAAK+H,OAAO4I,kBAIpC,QAEI5I,OAAOmY,qBAGX,QAEInY,OAAOyF,oBAGX,QAEIzF,OAAOgG,WAAWnP,oBAGtB,GAEI8gB,QACI3X,OAAO2R,4BAIf,QAEI3R,OAAO4V,MAAQ3d,KAAK+H,OAAO4V,MAqBnC3d,KAAK+H,OAAOgG,WAAW1D,SAAWrK,KAAK+H,OAAOgG,WAAWiG,QAAmB,KAATwL,QAC/DzX,OAAOgG,WAAWnP,cAItBwgB,QAAUI,YAEVJ,QAAU,yCAKZ1gB,KACE4gB,WAAW9f,KAAKQ,KAAK+H,OAAQrJ,6CAKjCqJ,OAAO4J,OAAQ,IAGR3R,KAAK+H,OAAOtJ,SAASwG,UAAWjF,KAAK+H,OAAOM,OAAOmG,WAAWuP,SAAS,wCAKhFnf,IAAeC,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GAEdmB,KAAK+H,OAAOM,OAAO8X,SAASC,UACb5gB,KAAKQ,KAAK+H,OAAQ1K,OAAQ,gBAAiB2C,KAAKqf,UAAWzgB,GAAQ,KAIvEY,KAAKQ,KAAK+H,OAAQ3F,SAASmD,KAAM,QAASvF,KAAKsf,WAAY1gB,KAGrEwD,SAASmD,KAAM,aAAcvF,KAAKuf,4DAMlCvf,KAAK+H,OAAOM,OAAO8X,SAASC,QAAUpgB,KAAK+H,OAAOM,OAAO8X,SAAS9a,WAChE7F,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOtJ,SAASwG,UAAW,gBAAiBjF,KAAKqf,WAAW,KAKvF7f,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOtJ,SAASwG,UAAW,WAAY,SAAAvG,KACjDA,EAAM+G,OAAQiM,EAAK3J,OAAOM,OAAOmG,WAAW6R,UAAU,OAGnE7gB,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOtJ,SAASwG,UAAW,UAAW,SAAAvG,GACtC,IAAlBA,EAAMuc,oBAMC,aACK7V,IAAmBsM,EAAK3J,OAAOM,OAAOmG,WAAW6R,UAAU,IACxE,OAIJ7gB,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOtJ,SAASwG,UAAW,2EAA4E,SAAAvG,OACrHkO,EAAa8E,EAAK3J,OAAOtJ,SAAzBmO,SAGW,oBAAflO,EAAMiB,SACG+F,SAAU,IACVwZ,OAAQ,OAUjBoB,EAAQ,GALR,aACA,YACA,aACFvb,SAASrG,EAAMiB,WAKVkf,eAAerf,KAAKkS,EAAK3J,QAAQ,KAE5B2J,EAAK3J,OAAO4J,MAAQ,IAAO,kBAI1BD,EAAK3J,OAAOgX,OAAOnS,YAE3B7E,OAAOgX,OAAOnS,SAAWoS,WAAW,kBAAMrY,GAAGkY,eAAerf,KAAKkS,EAAK3J,QAAQ,IAAQuY,qDAO5F9gB,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,4BAA6B,SAAAzI,UAASkO,EAASiR,WAAWre,KAAKqT,EAAK9K,OAAQrJ,OAGjHc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,2CAA4C,SAAAzI,UAASkO,EAASyR,eAAe7e,KAAKqT,EAAK9K,OAAQrJ,OAIpIc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,UAAW,aAClC0L,EAAK9K,OAAOtJ,SAAS0P,QAAS0E,EAAK9K,OAAOwY,YAC1C1N,EAAK9K,OAAOtJ,SAAS4O,QAAQK,MAAOmF,EAAK9K,OAAOwY,cAI9D/gB,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,QAAS,WAEzC0L,EAAK9K,OAAOX,SAAWyL,EAAK9K,OAAOT,SAAWuL,EAAK9K,OAAOM,OAAOmY,cAE5DzY,OAAOwF,cAKjB/N,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,kCAAmC,SAAAzI,UAASkO,EAASwF,eAAe5S,KAAKqT,EAAK9K,OAAQrJ,OAG3Hc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,eAAgB,SAAAzI,UAASkO,EAASgR,aAAape,KAAKqT,EAAK9K,OAAQrJ,OAGtGc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,8CAA+C,SAAAzI,UAASiI,GAAGmX,aAAate,KAAKqT,EAAK9K,OAAQrJ,OAG/Hc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,iCAAkC,SAAAzI,UAASiI,GAAG8Z,aAAajhB,KAAKqT,EAAK9K,OAAQrJ,OAIlHc,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,UAAW,WAC1C0L,EAAK9K,OAAO2Y,KAKb7N,EAAK9K,OAAO2Y,IAAIrW,UAAYwI,EAAK9K,OAAO2Y,IAAIC,eAEvC5Y,OAAO2Y,IAAIE,eAAe/U,KAAK,kBAAMgH,EAAK9K,OAAO2Y,IAAItY,SAAQ2D,MAAM,kBAAM8G,EAAK9K,OAAOK,WAK9FpI,KAAK+H,OAAO7J,UAAUyI,IAAM3G,KAAK+H,OAAOM,OAAOwY,cAAgB7gB,KAAK+H,OAAOR,QAAS,KAE9EzG,EAAUoE,EAAW1F,KAAKQ,KAAK+H,OAArB,IAAiC/H,KAAK+H,OAAOM,OAAOmG,WAAW1H,WAG1EvK,EAAG+C,QAAQwB,YAKbtB,KAAKQ,KAAK+H,OAAQjH,EAAS,QAAS,WAE/B+R,EAAK9K,OAAOM,OAAO4W,cAAgBpM,EAAK9K,OAAO4J,QAAUkB,EAAK9K,OAAOwK,SAIrEM,EAAK9K,OAAOwK,SACPxK,OAAOK,OACLyK,EAAK9K,OAAO+Y,SACd/Y,OAAOwF,YACPxF,OAAOK,UAEPL,OAAOuF,WAMpBtN,KAAK+H,OAAO7J,UAAUyI,IAAM3G,KAAK+H,OAAOM,OAAO0Y,sBAC5CvhB,KAAKQ,KAAK+H,OACT/H,KAAK+H,OAAOtJ,SAASqC,QACrB,cACA,SAAApC,KACUyc,mBAEV,KAKL3b,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,eAAgB,aAE/CY,OAAOuC,QAAQ+N,KAAMlK,OAAQ0E,EAAK9K,OAAOoG,OAAQwC,MAAOkC,EAAK9K,OAAO4I,YAI1EnR,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,aAAc,aAEzCqM,cAAchU,KAAKqT,EAAK9K,OAAQ,WAGpCA,OAAOuC,QAAQ+N,KAAMjE,MAAOvB,EAAK9K,OAAOqM,YAI9C5U,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,mBAAoB,SAAAzI,KAEnDqJ,OAAOuC,QAAQ+N,KAAMzF,QAASlU,EAAM+B,OAAOmS,cAIjDpT,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,gBAAiB,SAAAzI,KAE5C8U,cAAchU,KAAKqT,EAAK9K,OAAQ,UAAW,KAAMrJ,EAAM+B,OAAOmS,aAIxEpT,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,iBAAkB,aAE7CqM,cAAchU,KAAKqT,EAAK9K,OAAQ,cAGpCA,OAAOuC,QAAQ+N,KAAMpE,SAAUpB,EAAK9K,OAAOkM,eAIjDzU,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAO,mCAAoC,aAE/DqM,cAAchU,KAAKqT,EAAK9K,OAAQ,cAGpCA,OAAOuC,QAAQ+N,KAAMvK,SAAU+E,EAAK9K,OAAO+F,SAASkG,aAK1DxU,KAAKQ,KAAK+H,OAAQ/H,KAAK+H,OAAOZ,MAAOnH,KAAK+H,OAAOM,OAAO5I,OAAOmJ,QAC9D,QACA,YACDqO,KAAK,KAAM,SAAAvY,SACUA,EAAf+B,OAAAA,OADc3B,IAAAkiB,KAAAA,EAIA,UAAftiB,EAAMiB,SACGkT,EAAK9K,OAAOZ,MAAMuH,SAGlBlP,KAAKqT,EAAK9K,OAAQ8K,EAAK9K,OAAOtJ,SAASwG,UAAWvG,EAAMiB,MAAM,EAAMc,mDAO/EwgB,EAAahb,EAAQiH,KAAO,SAAW,QAGvCgU,EAAQ,SAACxiB,EAAOyiB,EAAgBC,OAC5BC,EAAgBtN,EAAKhM,OAAOM,OAAOmV,UAAU4D,GAE/CE,GAAW,EADU/kB,EAAG4C,SAASkiB,OAKtBA,EAAc7hB,KAAKuU,EAAKhM,OAAQrJ,IAI3C4iB,GAAY/kB,EAAG4C,SAASgiB,MACT3hB,KAAKuU,EAAKhM,OAAQrJ,IAKnCyV,EAAO,SAAC7U,EAASK,EAAMwhB,EAAgBC,OAAkBriB,IAAmBF,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,KAAAA,UAAA,GACxEwiB,EAAgBtN,EAAKhM,OAAOM,OAAOmV,UAAU4D,GAC7CG,EAAmBhlB,EAAG4C,SAASkiB,KAElC7hB,KAAKuU,EAAKhM,OAAQzI,EAASK,EAAM,SAAAjB,UAASwiB,EAAMxiB,EAAOyiB,EAAgBC,IAAmBriB,IAAYwiB,MAIxGvhB,KAAK+H,OAAOtJ,SAAS4O,QAAQjF,KAAM,QAASpI,KAAK+H,OAAOgY,WAAY,UAGpE/f,KAAK+H,OAAOtJ,SAAS4O,QAAQE,QAAS,QAASvN,KAAK+H,OAAOwF,QAAS,aAGpEvN,KAAK+H,OAAOtJ,SAAS4O,QAAQG,OAAQ,QAASxN,KAAK+H,OAAOyF,OAAQ,YAGlExN,KAAK+H,OAAOtJ,SAAS4O,QAAQI,YAAa,QAASzN,KAAK+H,OAAOmY,QAAS,iBAIzElgB,KAAK+H,OAAOtJ,SAAS4O,QAAQK,KAC7B,QACA,aACS3F,OAAO4I,OAASoD,EAAKhM,OAAO4I,OAErC,UAIC3Q,KAAK+H,OAAOtJ,SAAS4O,QAAQS,SAAU,QAAS9N,KAAK+H,OAAO2R,kBAI7D1Z,KAAK+H,OAAOtJ,SAAS4O,QAAQU,WAC7B,QACA,aACShG,OAAOgG,WAAWnP,UAE3B,gBAKAoB,KAAK+H,OAAOtJ,SAAS4O,QAAQM,IAC7B,QACA,aACS5F,OAAO4F,IAAM,UAEtB,SAIC3N,KAAK+H,OAAOtJ,SAAS4O,QAAQO,QAAS,QAAS5N,KAAK+H,OAAO6F,QAAS,aAGpE5N,KAAK+H,OAAOtJ,SAAS4O,QAAQQ,SAAU,QAAS,SAAAnP,KACxC4gB,WAAW9f,KAAKuU,EAAKhM,OAAQrJ,OAIrCsB,KAAK+H,OAAOtJ,SAASoP,SAAS6G,KAAM,QAAS,SAAAhW,KACxCoW,sBAGA0M,EAAc,eACV5d,EAAAA,iBAAsBmQ,EAAKhM,OAAOnE,GAAlC,UACG6d,QAAQjiB,KAAKuU,EAAKhM,OAAQnE,OAInCa,EAAQ/F,EAAM+G,OAAQsO,EAAKhM,OAAOM,OAAO+E,UAAUa,OAAOgG,YAEtDvV,EACA,aACSqJ,OAAO2L,aAAejX,OAAOiC,EAAM+G,OAAOzD,YAGnD,iBAED,GAAIyC,EAAQ/F,EAAM+G,OAAQsO,EAAKhM,OAAOM,OAAO+E,UAAUa,OAAO2E,WAE7DlU,EACA,aACSqJ,OAAO6K,QAAUlU,EAAM+G,OAAOzD,WAGvC,gBAED,GAAIyC,EAAQ/F,EAAM+G,OAAQsO,EAAKhM,OAAOM,OAAO+E,UAAUa,OAAOmG,SAE7D1V,EACA,aACSqJ,OAAOqM,MAAQrC,WAAWrT,EAAM+G,OAAOzD,YAGhD,aAED,KACGyS,EAAM/V,EAAM+G,SACTgc,QAAQjiB,KAAKuU,EAAKhM,OAAQ0M,EAAI9O,aAAa,uBAKvD3F,KAAK+H,OAAOtJ,SAASwP,OAAOC,KAAM,sBAAuB,SAAAxP,OACpD4S,EAAayC,EAAKhM,OAAOtJ,SAASuP,SAASuD,wBAC3CF,EAAU,IAAMC,EAAWM,OAASlT,EAAMmT,MAAQP,EAAWQ,QAC7D4P,cAAczf,aAAa,aAAcoP,OAI9CrR,KAAK+H,OAAOtJ,SAASwP,OAAOC,KAAM,sDAAuD,SAAAxP,OACpFwP,EAAOxP,EAAMgjB,cAEblC,EAAO9gB,EAAMuc,QAAUvc,EAAMuc,QAAUvc,EAAM+gB,MAC7CkC,EAAYjjB,EAAMiB,QAEL,YAAdgiB,GAAyC,UAAdA,GAAoC,KAATnC,GAAwB,KAATA,OAIpEpX,EAAO8F,EAAKjK,aAAa,kBAGzB2d,GACF,UACA,WACA,SACF7c,SAASrG,EAAMiB,MAGbyI,GAAQwZ,KACH1d,gBAAgB,oBAChB6D,OAAOK,SACJwZ,GAAQ7N,EAAKhM,OAAOE,YACvBhG,aAAa,iBAAkB,MAC/B8F,OAAOuF,cAMhBtN,KAAK+H,OAAOtJ,SAASwP,OAAOC,KAC5B+S,EACA,SAAAviB,OACUwP,EAAOxP,EAAMgjB,cAGfG,EAAS3T,EAAKvI,aAAa,cAE3BpJ,EAAG2C,MAAM2iB,OACA3T,EAAKlM,SAGbkC,gBAAgB,gBAEhB6D,OAAOC,YAAc6Z,EAAS3T,EAAK2C,IAAMkD,EAAKhM,OAAOuG,UAE9D,QAKAtO,KAAK+H,OAAOM,OAAOyZ,eAAiBvlB,EAAG+C,QAAQU,KAAK+H,OAAOtJ,SAAS2P,QAAQE,aACvEtO,KAAK+H,OAAOtJ,SAAS2P,QAAQpG,YAAa,QAAS,WAEpB,IAA5B+L,EAAKhM,OAAOC,gBAIXD,OAAOM,OAAO6J,YAAc6B,EAAKhM,OAAOM,OAAO6J,aAE3C2L,WAAWre,KAAKuU,EAAKhM,aAMlC/H,KAAK+H,OAAOtJ,SAASwP,OAAOE,OAC5B8S,EACA,SAAAviB,KACSqJ,OAAOoG,OAASzP,EAAM+G,OAAOzD,OAEtC,UAIAiE,EAAQiL,YACHlM,EAAYxF,KAAKQ,KAAK+H,OAAQ,uBAAwB,QAAS,SAAArJ,KACvDsR,gBAAgBxQ,KAAKuU,EAAKhM,OAAQrJ,EAAM+G,YAKpDzF,KAAK+H,OAAOtJ,SAASuP,SAAU,kCAAmC,SAAAtP,UAASkO,EAAS4F,kBAAkBhT,KAAKuU,EAAKhM,OAAQrJ,OAGxHsB,KAAK+H,OAAOtJ,SAASmO,SAAU,wBAAyB,SAAAlO,KACpDqJ,OAAOtJ,SAASmO,SAASsS,OAASnL,EAAKhM,OAAO4J,OAAwB,eAAfjT,EAAMiB,SAIjEK,KAAK+H,OAAOtJ,SAASmO,SAAU,oDAAqD,SAAAlO,KAChFqJ,OAAOtJ,SAASmO,SAASlH,SAC1B,YACA,cACFX,SAASrG,EAAMiB,UAIhBK,KAAK+H,OAAOtJ,SAASmO,SAAU,mBAAoB,SAAAlO,SACfqV,EAAKhM,OAAlCM,EADqD0Z,EACrD1Z,OAAQ5J,EAD6CsjB,EAC7CtjB,SAAUsgB,EADmCgD,EACnChD,YAGdtgB,EAASmO,SAAUvE,EAAOmG,WAAWwT,aAA6B,YAAftjB,EAAMiB,SAGlEkf,eAAerf,KAAKuU,EAAKhM,OAAuB,YAAfrJ,EAAMiB,MAGvB,YAAfjB,EAAMiB,KAAoB,YAEf,aACKlB,EAASmO,SAAUvE,EAAOmG,WAAWwT,cAAc,IAChE,OAGG1B,EAAQvM,EAAKpC,MAAQ,IAAO,iBAGrBoN,EAAOnS,YAEbA,SAAWoS,WAAW,kBAAMrY,GAAGkY,eAAerf,KAAKuU,EAAKhM,QAAQ,IAAQuY,QAMnFtgB,KAAK+H,OAAOtJ,SAASwP,OAAOE,OAC5B,QACA,SAAAzP,OAGU6N,EAAW7N,EAAMujB,kCAEnBC,EAAY,GAGZxjB,EAAMyjB,OAAS,GAAKzjB,EAAM0jB,OAAS,KAC/B7V,KACKxE,OAAOkY,eANP,QAOQ,MAERlY,OAAOiY,eATP,OAUO,KAKhBthB,EAAMyjB,OAAS,GAAKzjB,EAAM0jB,OAAS,KAC/B7V,KACKxE,OAAOiY,eAjBP,OAkBO,MAEPjY,OAAOkY,eApBP,QAqBQ,KAKF,IAAdiC,GAAmBnO,EAAKhM,OAAOZ,MAAMgH,OAAS,IAAsB,IAAf+T,GAAoBnO,EAAKhM,OAAOZ,MAAMgH,OAAS,MAC/FgN,kBAGd,UACA,SAxsBNgE,+HCXL,IAAekD,EAAAA,EAQR,WAMR,IAAIC,EAAU,aACVC,KACAC,KACAC,KAmDJ,SAASC,EAAQC,EAAUC,GAEzB,GAAKD,EAAL,CAEA,IAAIE,EAAIJ,EAAoBE,GAM5B,GAHAH,EAAkBG,GAAYC,EAGzBC,EAGL,KAAOA,EAAE/kB,QACP+kB,EAAE,GAAGF,EAAUC,GACfC,EAAEC,OAAO,EAAG,IAUhB,SAASC,EAAiB5iB,EAAM6iB,GAE1B7iB,EAAKX,OAAMW,GAAQ8iB,QAAS9iB,IAG5B6iB,EAAallB,QAASqC,EAAKuO,OAAS4T,GAASU,IAC3C7iB,EAAK8iB,SAAWX,GAASniB,GASjC,SAAS+iB,EAAS/T,EAAMgU,EAAYhjB,EAAMijB,GACxC,IAKIC,EACA9kB,EANA+kB,EAAMlhB,SACNmhB,EAAQpjB,EAAKojB,MACbC,GAAYrjB,EAAKsjB,YAAc,GAAK,EACpCC,EAAmBvjB,EAAKwjB,QAAUrB,EAClCsB,EAAezU,EAAK3L,QAAQ,cAAe,IAI/C4f,EAAWA,GAAY,EAEnB,iBAAiBzlB,KAAKwR,IACxBkU,GAAQ,GAGR9kB,EAAI+kB,EAAIphB,cAAc,SACpB2hB,IAAM,aACRtlB,EAAE0Z,KAAO2L,GACA,+BAA+BjmB,KAAKwR,IAE7C5Q,EAAI+kB,EAAIphB,cAAc,QACpBgG,IAAM0b,IAGRrlB,EAAI+kB,EAAIphB,cAAc,WACpBgG,IAAMiH,EACR5Q,EAAEglB,WAAkBzkB,IAAVykB,GAA6BA,GAGzChlB,EAAE6e,OAAS7e,EAAE8e,QAAU9e,EAAEulB,aAAe,SAAUC,GAChD,IAAIjY,EAASiY,EAAGpkB,KAAK,GAIrB,GAAI0jB,GAAS,cAAe9kB,EAC1B,IACOA,EAAEylB,MAAMC,QAAQnmB,SAAQgO,EAAS,KACtC,MAAO2P,GAGP3P,EAAS,IAKb,GAAc,KAAVA,IAEFsX,GAAY,GAGGI,EACb,OAAON,EAAS/T,EAAMgU,EAAYhjB,EAAMijB,GAK5CD,EAAWhU,EAAMrD,EAAQiY,EAAGG,oBAII,IAA9BR,EAAiBvU,EAAM5Q,IAAc+kB,EAAIa,KAAK3iB,YAAYjD,GA+ChE,SAAS6lB,EAAOC,EAAOC,EAAMC,GAC3B,IAAI5B,EACAxiB,EASJ,GANImkB,GAAQA,EAAKhhB,OAAMqf,EAAW2B,GAGlCnkB,GAAQwiB,EAAW4B,EAAOD,OAGtB3B,EAAU,CACZ,GAAIA,KAAYJ,EACd,KAAM,SAENA,EAAcI,IAAY,GArDhC,SAAmB0B,EAAOlB,EAAYhjB,GAIpC,IAGIqkB,EACAxb,EAJAyb,GAFJJ,EAAQA,EAAMvkB,KAAOukB,GAASA,IAEPvmB,OACnB2d,EAAIgJ,EACJ7B,KAqBJ,IAhBA4B,EAAK,SAASrV,EAAMrD,EAAQoY,GAM1B,GAJc,KAAVpY,GAAe8W,EAAc9iB,KAAKqP,GAIxB,KAAVrD,EAAe,CACjB,IAAIoY,EACC,OADiBtB,EAAc9iB,KAAKqP,KAI3CsV,GACiBtB,EAAWP,IAIzB5Z,EAAE,EAAGA,EAAIyS,EAAGzS,IAAKka,EAASmB,EAAMrb,GAAIwb,EAAIrkB,GA+B7CukB,CAAUL,EAAO,SAAUzB,GAEzBG,EAAiB5iB,EAAMyiB,GAGvBF,EAAQC,EAAUC,IACjBziB,GAiDL,OAxCAikB,EAAOpG,MAAQ,SAAe2G,EAAMxkB,GAOlC,OAxOF,SAAmBykB,EAAWzB,GAE5ByB,EAAYA,EAAU9kB,KAAO8kB,GAAaA,GAE1C,IAGIJ,EACA7B,EACAkC,EALA7B,KACAha,EAAI4b,EAAU9mB,OACd2mB,EAAazb,EAejB,IARAwb,EAAK,SAAU7B,EAAUC,GACnBA,EAAc9kB,QAAQklB,EAAaljB,KAAK6iB,KAE5C8B,GACiBtB,EAAWH,IAIvBha,KACL2Z,EAAWiC,EAAU5b,IAGrB6b,EAAIrC,EAAkBG,IAEpB6B,EAAG7B,EAAUkC,IAKXpC,EAAoBE,GAAYF,EAAoBE,QACtD7iB,KAAK0kB,GAkMTM,CAAUH,EAAM,SAAU3B,GAExBD,EAAiB5iB,EAAM6iB,KAGlBoB,GAQTA,EAAOxC,KAAO,SAAce,GAC1BD,EAAQC,OAOVyB,EAAOW,MAAQ,WACbxC,KACAC,KACAC,MAQF2B,EAAOY,UAAY,SAAmBrC,GACpC,OAAOA,KAAYJ,GAKd6B,GA9RHa,EAAAC,QAAiB7C,6CCErB,SAAwB8C,GAAWja,UACxB,IAAImM,QAAQ,SAACC,EAASC,MAClBrM,WACMoM,QACFC,MC2BnB,SAAS6N,GAAoBhd,GACrBA,IAASpI,KAAKwZ,MAAM6L,iBACf7L,MAAM6L,WAAY,GAEvBrlB,KAAKmH,MAAMoL,SAAWnK,SACjBjB,MAAMoL,QAAUnK,IACR5I,KAAKQ,KAAMA,KAAKmH,MAAOiB,EAAO,OAAS,UAI5D,IAAMkd,UAAQ,wBAGMtlB,KAAKvB,SAASqC,QAASd,KAAKqI,OAAOmG,WAAWgL,OAAO,MAG3D+L,eAAe/lB,KAAKQ,MAGrBzD,EAAGwB,OAAOV,OAAOmoB,UASZxH,MAAMxe,KAAKQ,SARNA,KAAKqI,OAAOod,KAAKH,MAAMI,KAC7B7Z,KAAK,cACImS,MAAMxe,KAAKI,KAEpBmM,MAAM,SAAA2C,KACEnG,MAAMoG,KAAK,2BAA4BD,qBAflD,SAwBKvS,OACLwpB,EAAQppB,EAAGkB,OAAOtB,GAASA,EAAMuD,MAAM,KAAOM,KAAKqI,OAAOsd,MAAMjmB,MAAM,KACtEkmB,EAAU,IAAMD,EAAM,GAAKA,EAAM,WAClClnB,SAASqC,QAAQiF,MAAM8f,cAAmBD,EAA/C,IAEI5lB,KAAK9B,UAAUyI,GAAI,KAEbmf,GADS,IACUF,GAAV,SAEVze,MAAMpB,MAAMggB,UAAjB,eAA4CD,EAA5C,aAjCE,sBAuCA/d,EAAS/H,KAeTmY,EAASD,SAXLnQ,EAAOM,OAAOsV,KAAK3J,gBACfjM,EAAOie,iBAET,YACE,SACH,SACA,cACM,UACJ,qBACKhmB,KAAKqI,OAAO0F,WAAWiO,YAKrCrU,EAASI,EAAOZ,MAAMxB,aAAa,OAGnCpJ,EAAG2C,MAAMyI,OACAI,EAAOZ,MAAMxB,aAAaoC,EAAOM,OAAO1G,WAAW6X,MAAM5V,SA5F7DsH,EA+FHtH,GA/FGsH,EA+FUvD,EA9FnBpL,EAAG2C,MAAMgM,GACF,KAGP3O,EAAGiQ,OAAO/P,OAAOyO,IACVA,EAIJA,EAAInC,MADG,mCACYG,OAAO+c,GAAK/a,GAwF5BqT,EAASrc,EAAc,UACvBgG,EAAMW,EAAOd,EAAOM,OAAOod,KAAKH,MAAM/G,OAAQ3a,EAAIuU,KACjDlW,aAAa,MAAOiG,KACpBjG,aAAa,kBAAmB,MAChCA,aAAa,oBAAqB,MAClCA,aAAa,QAAS,gBAGvBnB,EAAUoB,EAAc,OAASyB,MAAOoE,EAAOM,OAAOmG,WAAW0X,mBAC/D1kB,YAAY+c,KACbpX,MAAQvE,EAAe9B,EAASiH,EAAOZ,SAGxC0B,EAAOd,EAAOM,OAAOod,KAAKH,MAAM5e,IAAK9C,GAAK,QAAQiI,KAAK,SAAA8L,OACrDpb,EAAG2C,MAAMyY,QAKPzM,EAAM,IAAI4B,IAAI6K,EAAS,GAAGwO,mBAG5BC,SAAclb,EAAIkb,SAAS1mB,MAAM,KAAK,GAA1C,UAGG0e,UAAU5e,KAAKuI,EAAQmD,EAAI+M,WAK3BuB,MAAQ,IAAInc,OAAOmoB,MAAMa,OAAO9H,aACxBxW,EAAOM,OAAOie,gBAClBve,EAAO4I,UAGXxJ,MAAMoL,QAAS,IACfpL,MAAMa,YAAc,EAGvBD,EAAO7J,UAAUyI,MACV6S,MAAM+M,qBAIVpf,MAAMiB,KAAO,qBACI5I,KAAKuI,GAAQ,GAC1BA,EAAOyR,MAAMpR,UAGjBjB,MAAMmG,MAAQ,qBACG9N,KAAKuI,GAAQ,GAC1BA,EAAOyR,MAAMlM,WAGjBnG,MAAMqf,KAAO,aACTlZ,UACAtF,YAAc,OAInBA,EAAgBD,EAAOZ,MAAvBa,mBACC5J,eAAe2J,EAAOZ,MAAO,mBAAe,kBAEpCa,OAFoC,SAI3CqE,OAIQmN,EAAiCzR,EAAjCyR,MAAOrS,EAA0BY,EAA1BZ,MAAOoL,EAAmBxK,EAAnBwK,OAAQpE,EAAWpG,EAAXoG,OACxBsY,EAAelU,IAAWiH,EAAM6L,YAGhClT,SAAU,IACH3S,KAAKuI,EAAQZ,EAAO,mBAGzBmQ,QAAQmP,GAAgBjN,EAAMkN,UAAU,IAE3C7a,KAAK,kBAAM2N,EAAMmN,eAAeta,KAEhCR,KAAK,kBAAM4a,GAAgBjN,EAAMlM,UAEjCzB,KAAK,kBAAM4a,GAAgBjN,EAAMkN,UAAUvY,KAC3CpC,MAAM,qBAOfqI,EAAQrM,EAAOM,OAAO+L,MAAMwS,gBACzBxoB,eAAe2J,EAAOZ,MAAO,oBAAgB,kBAErCiN,OAFqC,SAI5CjY,KACOqd,MACFqN,gBAAgB1qB,GAChB0P,KAAK,aACM1P,IACKqD,KAAKuI,EAAQA,EAAOZ,MAAO,gBAE3C4E,MAAM,SAAA2C,GAEgB,UAAfA,EAAMyG,QACGoB,aAAa/W,KAAKuI,eAOzCoG,EAAWpG,EAAOM,OAAlB8F,cACC/P,eAAe2J,EAAOZ,MAAO,cAAU,kBAE/BgH,OAF+B,SAItChS,KACOqd,MAAMkN,UAAUvqB,GAAO0P,KAAK,aACtB1P,IACIqD,KAAKuI,EAAQA,EAAOZ,MAAO,yBAM9CwJ,EAAU5I,EAAOM,OAAjBsI,aACCvS,eAAe2J,EAAOZ,MAAO,aAAS,kBAE9BwJ,OAF8B,SAIrCxU,OACMyC,IAASrC,EAAGyH,QAAQ7H,IAASA,IAE5Bqd,MAAMkN,UAAU9nB,EAAS,EAAImJ,EAAOM,OAAO8F,QAAQtC,KAAK,aACnDjN,IACKY,KAAKuI,EAAQA,EAAOZ,MAAO,yBAM9CwW,EAAS5V,EAAOM,OAAhBsV,YACCvf,eAAe2J,EAAOZ,MAAO,YAAQ,kBAE7BwW,OAF6B,SAIpCxhB,OACMyC,EAASrC,EAAGyH,QAAQ7H,GAASA,EAAQ4L,EAAOM,OAAOsV,KAAK3J,SAEvDwF,MAAMsN,QAAQloB,GAAQiN,KAAK,aACvBjN,WAMfmoB,OAAAA,IACGvN,MACFwN,cACAnb,KAAK,SAAA7J,KACWA,IAEhB+J,MAAM,SAAA2C,KACEnG,MAAMoG,KAAKD,YAGjBtQ,eAAe2J,EAAOZ,MAAO,kBAAc,kBAEnC4f,YAKR3oB,eAAe2J,EAAOZ,MAAO,aAAS,kBAE9BY,EAAOC,cAAgBD,EAAOuG,oBAKrC2Y,KACJlf,EAAOyR,MAAM0N,gBACbnf,EAAOyR,MAAM2N,mBACdtb,KAAK,SAAAub,OACEzB,EA9QlB,SAAwB/T,EAAOyD,OAErBsQ,EADW,SAAX0B,EAAYC,EAAGC,UAAa,IAANA,EAAUD,EAAID,EAASE,EAAGD,EAAIC,GAC5CF,CAASzV,EAAOyD,UACpBzD,EAAQ+T,EAAlB,IAA2BtQ,EAASsQ,EA2Qd6B,CAAeJ,EAAW,GAAIA,EAAW,OACjD7B,eAAe/lB,KAAKkS,EAAMiU,OAI7BnM,MAAMiO,aAAa1f,EAAOM,OAAOie,WAAWza,KAAK,SAAAjG,KAC7CyC,OAAOie,UAAY1gB,MAIvB4T,MAAMkO,gBAAgB7b,KAAK,SAAA7B,KACvB3B,OAAO2B,MAAQA,KACnBiU,SAASze,KAAKkS,OAId8H,MAAMmO,iBAAiB9b,KAAK,SAAA7J,KACjBA,IACDxC,KAAKuI,EAAQA,EAAOZ,MAAO,kBAIrCqS,MAAMoO,cAAc/b,KAAK,SAAA7J,KACrBmF,MAAMmH,SAAWtM,IACXxC,KAAKuI,EAAQA,EAAOZ,MAAO,sBAIrCqS,MAAMqO,gBAAgBhc,KAAK,SAAA+H,KACvBzM,MAAMoR,WAAa3E,KACjB8J,MAAMle,KAAKuI,OAGjByR,MAAMzZ,GAAG,YAAa,SAAA8B,WAAGkY,KACtB+N,QADsChpB,IAAAipB,KAAAA,GAClBjgB,IAAI,SAAAmS,UnB1QhBtS,EmB0QiCsS,EAAI9X,KnBzQrD6lB,EAAW5lB,SAAS6lB,yBACpB3oB,EAAU8C,SAASF,cAAc,SAC9BV,YAAYlC,KACbqK,UAAYhC,EACbqgB,EAASE,WAAW7lB,UAL/B,IAA0BsF,EAChBqgB,EACA1oB,OmByQW6Z,WAAW3Z,KAAKuI,EAAQ+f,OAG9BtO,MAAMzZ,GAAG,SAAU,cAEfyZ,MAAM2O,YAAYtc,KAAK,SAAA0G,MACN/S,KAAKuI,GAASwK,GAC7BA,KACY/S,KAAKuI,EAAQA,EAAOZ,MAAO,aAI5C5K,EAAG+C,QAAQyI,EAAOyR,MAAMla,UAAYyI,EAAO7J,UAAUyI,KACvCoB,EAAOyR,MAAMla,QAIrB2C,aAAa,YAAa,OAIjCuX,MAAMzZ,GAAG,OAAQ,cACAP,KAAKuI,GAAQ,KACpBvI,KAAKuI,EAAQA,EAAOZ,MAAO,eAGrCqS,MAAMzZ,GAAG,QAAS,cACDP,KAAKuI,GAAQ,OAG9ByR,MAAMzZ,GAAG,aAAc,SAAAwL,KACnBpE,MAAMgL,SAAU,IACT5G,EAAK6c,UACN5oB,KAAKuI,EAAQA,EAAOZ,MAAO,kBAGrCqS,MAAMzZ,GAAG,WAAY,SAAAwL,KACjBpE,MAAM8J,SAAW1F,EAAK8F,UAChB7R,KAAKuI,EAAQA,EAAOZ,MAAO,YAGL,IAA/B8E,SAASV,EAAK8F,QAAS,OACV7R,KAAKuI,EAAQA,EAAOZ,MAAO,oBAKrCqS,MAAMoO,cAAc/b,KAAK,SAAA7J,GACxBA,IAAU+F,EAAOZ,MAAMmH,aAChBnH,MAAMmH,SAAWtM,IACXxC,KAAKuI,EAAQA,EAAOZ,MAAO,yBAK7CqS,MAAMzZ,GAAG,SAAU,aACfoH,MAAMgL,SAAU,IACV3S,KAAKuI,EAAQA,EAAOZ,MAAO,cAGrCqS,MAAMzZ,GAAG,QAAS,aACdoH,MAAMoL,QAAS,IACT/S,KAAKuI,EAAQA,EAAOZ,MAAO,aAGrCqS,MAAMzZ,GAAG,QAAS,SAAAU,KACd0G,MAAMuH,MAAQjO,IACRjB,KAAKuI,EAAQA,EAAOZ,MAAO,sBAIjC,kBAAMR,GAAG0hB,MAAM7oB,KAAKuI,IAAS,KC5XhD,SAASugB,GAAensB,OAYdosB,EAAQ/rB,OAAOoF,gBAVT,YACA,YACA,WACD,UACA,WACC,UACD,SACD,MAG8BkE,KAAK,SAAAyiB,UAASA,EAAMxjB,SAAS5I,YAEjEosB,EAEOA,EAAMziB,KAAK,SAAA9D,UAASA,IAAU7F,IAGlC,UAYX,SAASipB,GAAoBhd,GACrBA,IAASpI,KAAKwZ,MAAM6L,iBACf7L,MAAM6L,WAAY,GAEvBrlB,KAAKmH,MAAMoL,SAAWnK,SACjBjB,MAAMoL,QAAUnK,IACR5I,KAAKQ,KAAMA,KAAKmH,MAAOiB,EAAO,OAAS,UAI5D,IrB5D0BrK,GqB4DpByqB,UAAU,wBAGIxoB,KAAKvB,SAASqC,QAASd,KAAKqI,OAAOmG,WAAWgL,OAAO,MAGzD+L,eAAe/lB,KAAKQ,MAGxBzD,EAAGwB,OAAOV,OAAOorB,KAAOlsB,EAAG4C,SAAS9B,OAAOorB,GAAGpC,WACtCrI,MAAMxe,KAAKQ,UAGRA,KAAKqI,OAAOod,KAAK+C,QAAQ9C,KAAK3Z,MAAM,SAAA2C,KACtCnG,MAAMoG,KAAK,6BAA8BD,YAK3Cga,wBAA0BrrB,OAAOqrB,mCAGjCA,wBAAwB5oB,KAAK,cACxBke,MAAMxe,KAAKI,YAIhB+oB,wBAA0B,kBACtBD,wBAAwBrpB,QAAQ,SAAAV,qBA5BvC,SAoCHiqB,iBAIDrsB,EAAG4C,SAASa,KAAKwZ,MAAMqP,cAAe,KAC9B7e,EAAUhK,KAAKwZ,MAAMqP,eAArB7e,SAEJzN,EAAG2C,MAAM8K,eACJ3B,OAAO2B,MAAQA,UACjBiU,SAASze,KAAKQ,UAMnB8B,EAAM9B,KAAKqI,OAAOrK,KAAK8qB,OACzBvsB,EAAGkB,OAAOqE,KAASvF,EAAG2C,MAAM4C,MAChB+G,EAAO7I,KAAKqI,OAAOod,KAAK+C,QAAQ9hB,IAAKkiB,EAAS9mB,IAGrD+J,KAAK,SAAAC,GACEvP,EAAGwB,OAAO+N,OACLzD,OAAO2B,MAAQ8B,EAAOid,MAAM,GAAGC,QAAQhf,SACzCiU,SAASze,KAAKkS,MAGxB3F,MAAM,8BA9DP,eAoEF4Z,EAAQ3lB,KAAKqI,OAAOsd,MAAMjmB,MAAM,UACjCjB,SAASqC,QAAQiF,MAAM8f,cAAmB,IAAMF,EAAM,GAAKA,EAAM,GAAtE,WArEQ,eA0EF5d,EAAS/H,KAGTipB,EAAYlhB,EAAOZ,MAAMxB,aAAa,SACvCpJ,EAAG2C,MAAM+pB,KAAcA,EAAUC,WAAW,iBAK7CvhB,EAASI,EAAOZ,MAAMxB,aAAa,OAGnCpJ,EAAG2C,MAAMyI,OACAI,EAAOZ,MAAMxB,aAAa3F,KAAKqI,OAAO1G,WAAW6X,MAAM5V,SA1I3DsH,EA8IH0d,GA9IG1d,EA8IevD,EA7IxBpL,EAAG2C,MAAMgM,GACF,KAIJA,EAAInC,MADG,gEACYG,OAAO+c,GAAK/a,GAyI5BtH,EAAgBmE,EAAOvB,SpBvJjC,IAAoBgQ,KAAKC,MAAsB,IAAhBD,KAAKE,UoBwJ1BzR,EAAY/C,EAAc,OAAS0B,GAAAA,MAClCuD,MAAQvE,EAAeqC,EAAW8C,EAAOZ,WAG1CgiB,EAAY,SAAAC,uCAAwCR,EAAxC,IAAmD/f,EAAnD,kBAGRsgB,EAAU,UAAW,KAC1Bpd,MAAM,kBAAMgR,GAAUoM,EAAU,MAAO,OACvCpd,MAAM,kBAAMgR,GAAUoM,EAAU,SAChCtd,KAAK,SAAAoR,UAAStW,GAAGyX,UAAU5e,KAAKuI,EAAQkV,EAAM/U,OAC9C2D,KAAK,SAAAsd,GAEGA,EAAUpkB,SAAS,cACbtG,SAASyf,OAAOnY,MAAMsjB,eAAiB,aAMnD7P,MAAQ,IAAInc,OAAOorB,GAAGpC,OAAOziB,kCAGlBmE,EAAOM,OAAO2d,SAAW,EAAI,WAC7Bje,EAAO7J,UAAUyI,GAAK,EAAI,MAC/B,WACK,iBACM,iBACA,YACL,cACE,kBAIItJ,OAASA,OAAO2P,SAASiL,KAAO,oBAGjClQ,EAAO+F,SAASkG,OAAS,EAAI,eAC/BjM,EAAOM,OAAOyF,SAASmG,0BAEjC,SACIvV,OAGAnC,EAAGwB,OAAOgK,EAAOZ,MAAMuH,YAIrBjO,QACI/B,EAAM6M,aAIR7M,EAAM6M,WACL,IACM+d,QACH,kPAGH,IACMA,QACH,kIAGH,MACMA,QACH,gJAGH,SACA,MACMA,QAAU,uGAIVA,QAAU,6BAIlBniB,MAAMuH,MAAQjO,IAERjB,KAAKuI,EAAQA,EAAOZ,MAAO,mCAzCxC,aA4Ca3H,KAAKuI,EAAQA,EAAOZ,MAAO,iBAAiB,WAC5CY,EAAOZ,MAAMyL,gCA7C1B,SAgDiBlU,OAEX6qB,EAAW7qB,EAAM+G,SAGhB0B,MAAMqiB,aAAeD,EAASE,oBAExBjqB,KAAKuI,EAAQA,EAAOZ,MAAO,uBAvDxC,SAyDIzI,OAEE6qB,EAAW7qB,EAAM+G,UAGfikB,SAASlqB,KAAKuI,EAAQ6gB,KAGvBzhB,MAAMiB,KAAO,cACI5I,KAAKuI,GAAQ,KACxB4hB,eAGNxiB,MAAMmG,MAAQ,cACG9N,KAAKuI,GAAQ,KACxB6hB,gBAGNziB,MAAMqf,KAAO,aACPqD,eAGN1iB,MAAMmH,SAAWib,EAAS3B,gBAC1BzgB,MAAMoL,QAAS,IAGfpL,MAAMa,YAAc,SACpB5J,eAAe2J,EAAOZ,MAAO,mBAAe,kBAEpC1K,OAAO8sB,EAAS5B,uBAFoB,SAI3Ctb,GAEItE,EAAOwK,UACAiH,MAAM9L,SAIVvG,MAAMgL,SAAU,IACV3S,KAAKuI,EAAQA,EAAOZ,MAAO,aAG/B0a,OAAOxV,aAKjBjO,eAAe2J,EAAOZ,MAAO,oBAAgB,kBAErCoiB,EAASE,uBAF4B,SAI5CttB,KACS0qB,gBAAgB1qB,aAK1BiC,eAAe2J,EAAOZ,MAAO,eAAW,kBAEhCmhB,GAAeiB,EAASO,2BAFQ,SAIvC3tB,KACS4tB,mBAAmBzB,GAAensB,WAK7CgS,EAAWpG,EAAOM,OAAlB8F,cACC/P,eAAe2J,EAAOZ,MAAO,cAAU,kBAE/BgH,OAF+B,SAItChS,KACSA,IACAuqB,UAAmB,IAATvY,KACN3O,KAAKuI,EAAQA,EAAOZ,MAAO,uBAK1CwJ,EAAU5I,EAAOM,OAAjBsI,aACCvS,eAAe2J,EAAOZ,MAAO,aAAS,kBAE9BwJ,OAF8B,SAIrCxU,OACMyC,EAASrC,EAAGyH,QAAQ7H,GAASA,EAAQwU,IACnC/R,IACCA,EAAS,OAAS,cACdY,KAAKuI,EAAQA,EAAOZ,MAAO,0BAKzC/I,eAAe2J,EAAOZ,MAAO,kBAAc,kBAEnCoiB,EAASvC,wBAKjB5oB,eAAe2J,EAAOZ,MAAO,aAAS,kBAE9BY,EAAOC,cAAgBD,EAAOuG,cAKtCnQ,QAAQiW,MAAQmV,EAASS,4BAG5BjiB,EAAO7J,UAAUyI,MACVQ,MAAMlF,aAAa,YAAa,KAG9BzC,KAAKuI,EAAQA,EAAOZ,MAAO,gBAC3B3H,KAAKuI,EAAQA,EAAOZ,MAAO,gCAG1BY,EAAOgX,OAAOkL,aAGrBlL,OAAOkL,UAAYC,YAAY,aAE3B/iB,MAAM8J,SAAWsY,EAASY,0BAGC,OAA9BpiB,EAAOZ,MAAMijB,cAAyBriB,EAAOZ,MAAMijB,aAAeriB,EAAOZ,MAAM8J,aAClEzR,KAAKuI,EAAQA,EAAOZ,MAAO,cAIrCA,MAAMijB,aAAeriB,EAAOZ,MAAM8J,SAGX,IAA1BlJ,EAAOZ,MAAM8J,yBACClJ,EAAOgX,OAAOkL,aAGfzqB,KAAKuI,EAAQA,EAAOZ,MAAO,oBAE7C,gBAGQ,kBAAMR,GAAG0hB,MAAM7oB,KAAKuI,IAAS,mBAzMxC,SA2MUrJ,OAnWL2rB,EAqWCd,EAAW7qB,EAAM+G,4BAGTsC,EAAOgX,OAAO9W,SAEbF,EAAOZ,MAAMgL,UACxB,EACA,GACFpN,SAASrG,EAAM6M,UAINpE,MAAMgL,SAAU,IACV3S,KAAKuI,EAAQA,EAAOZ,MAAO,WAUpCzI,EAAM6M,WACJ,IAEW/L,KAAKuI,EAAQA,EAAOZ,MAAO,gBAGjCA,MAAM8J,SAAWsY,EAASY,2BACpB3qB,KAAKuI,EAAQA,EAAOZ,MAAO,uBAIvC,KACmB3H,KAAKuI,GAAQ,GAG7BA,EAAOZ,MAAMwW,QAEJkM,cACAF,eAEInqB,KAAKuI,EAAQA,EAAOZ,MAAO,oBAK3C,EAEGY,EAAOZ,MAAMoL,SAAWxK,EAAOyR,MAAM6L,YAC9Ble,MAAMmG,YAEO9N,KAAKuI,GAAQ,KAEpBvI,KAAKuI,EAAQA,EAAOZ,MAAO,aAGjC4X,OAAO9W,QAAUiiB,YAAY,aACnB1qB,KAAKuI,EAAQA,EAAOZ,MAAO,eACzC,IAKCY,EAAOZ,MAAMmH,WAAaib,EAAS3B,kBAC5BzgB,MAAMmH,SAAWib,EAAS3B,gBACpBpoB,KAAKuI,EAAQA,EAAOZ,MAAO,qBAInCkP,eAAe7W,KAAKuI,GA5apCsiB,EA4a4Dd,EAASe,4BA3atF/tB,EAAG2C,MAAMmrB,GACFA,EAGJpgB,EAAOogB,EAAOviB,IAAI,SAAAyiB,UAASjC,GAAeiC,oBA4axB,EAEIxiB,EAAO4I,SACD6I,MAAMgR,YAEGhrB,KAAKuI,GAAQ,KAQ5BvI,KAAKuI,EAAQA,EAAOtJ,SAASwG,UAAW,eAAe,QAC1DvG,EAAM6M,cCte9BpE,UAAQ,cAIDnH,KAAKmH,WAMEnH,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAW7O,KAAK6D,QAAQ,MAAOxD,KAAKL,OAAO,KAGhFK,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAWhI,SAAShD,QAAQ,MAAOxD,KAAKwG,WAAW,GAIhGxG,KAAKse,WACOte,KAAKvB,SAASwG,UAAWjF,KAAKqI,OAAOmG,WAAW7O,KAAK6D,QAAQ,MAAO,UAAU,GAI1FxD,KAAKsH,eAEA7I,SAASqC,QAAUoB,EAAc,aAC3BlC,KAAKqI,OAAOmG,WAAW1H,UAI7B9G,KAAKmH,MAAOnH,KAAKvB,SAASqC,cAG1BrC,SAASyf,OAAShc,EAAc,aAC1BlC,KAAKqI,OAAOmG,WAAW0P,cAG7Bzf,SAASqC,QAAQU,YAAYxB,KAAKvB,SAASyf,SAGhDle,KAAKse,eACGte,KAAKwG,cACJ,aACOkX,MAAMle,KAAKQ,gBAGlB,WACK0d,MAAMle,KAAKQ,WAMlBA,KAAKoH,WACNqB,OAAOjJ,KAAKQ,gBAhDbuI,MAAMoG,KAAK,6BCEtB8b,GAAAA,sBAMU1iB,6BACHA,OAASA,OACT2iB,YAAc3iB,EAAOM,OAAOqY,IAAIgK,iBAChCziB,SAAU,OACV0Y,aAAc,OACdliB,oBACU,sBACO,WAEjBksB,QAAU,UACVC,OAAS,UACTC,UAAY,UACZprB,eACAqrB,YAAc,UACdC,eAAiB,UAGjBnK,eAAiB,IAAIvJ,QAAQ,SAACC,EAASC,KAEnCxX,GAAG,SAAUuX,KAGbvX,GAAG,QAASwX,UAGhBpP,2DAWDnI,KAAKqK,UAEA9N,EAAGwB,OAAOV,OAAOyrB,SAAYvsB,EAAGwB,OAAOV,OAAOyrB,OAAOkC,UAUjDhN,WATMhe,KAAK+H,OAAOM,OAAOod,KAAKwF,UAAUvF,KACxC7Z,KAAK,aACGmS,UAERjS,MAAM,aAEEmf,QAAQ,QAAS,IAAItT,MAAM,qFAc3CuT,iBAAiB,KAAO,gBAGxBvK,eAAe/U,KAAK,aAChBuf,iBAAiB,+BAIrB5N,iBAGA6N,mDA8BA5sB,SAASwG,UAAY/C,EAAc,aAC7BlC,KAAK+H,OAAOM,OAAOmG,WAAWkS,WAEpC3Y,OAAOtJ,SAASwG,UAAUzD,YAAYxB,KAAKvB,SAASwG,kBAGlD+lB,IAAInd,SAASyd,aAAaxC,OAAOkC,IAAIO,eAAeC,UAAUC,gBAG9DT,IAAInd,SAAS6d,UAAU1rB,KAAK+H,OAAOM,OAAOqY,IAAIzM,eAIhDxV,SAASktB,iBAAmB,IAAI7C,OAAOkC,IAAIY,mBAAmB5rB,KAAKvB,SAASwG,gBAG5E4mB,6DAOG5mB,EAAcjF,KAAK+H,OAAOtJ,SAA1BwG,mBAIC2lB,OAAS,IAAI9B,OAAOkC,IAAIc,UAAU9rB,KAAKvB,SAASktB,uBAGhDf,OAAOvsB,iBAAiByqB,OAAOkC,IAAIe,sBAAsBC,KAAKC,mBAAoB,SAAAvtB,UAASqV,EAAKmY,mBAAmBxtB,KAAQ,QAC3HksB,OAAOvsB,iBAAiByqB,OAAOkC,IAAImB,aAAaH,KAAKI,SAAU,SAAA1d,UAASqF,EAAKsY,UAAU3d,KAAQ,OAG9F8I,EAAU,IAAIsR,OAAOkC,IAAIsB,aACvBC,SAAWvsB,KAAKwsB,SAIhBC,kBAAoBxnB,EAAUynB,cAC9BC,mBAAqB1nB,EAAU8R,eAC/B6V,qBAAuB3nB,EAAUynB,cACjCG,sBAAwB5nB,EAAU8R,eAGlC+V,wBAAyB,IAGzBC,oBAAoB/sB,KAAK+H,OAAO4I,YAEnCia,OAAOiB,WAAWrU,GACzB,MAAOjZ,QACA8tB,UAAU9tB,4DAQMM,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,yBAEPmB,KAAK+qB,0BACdtsB,SAASwG,UAAUf,gBAAgB,wBAUvC6mB,eAAiBb,YANP,eACL7d,EAAOD,EAAWoK,KAAK3F,IAAIyD,EAAKqW,QAAQqC,mBAAoB,IAC5Dtd,EAAW9F,EAAS,gBAAiB0K,EAAKvM,OAAOM,QAAjD,MAA8DgE,IAC/D5N,SAASwG,UAAUhD,aAAa,kBAAmByN,IAGlB,gDAO3BhR,cAETmP,EAAW,IAAIib,OAAOkC,IAAIiC,uBAGvBC,6CAA8C,IAC9CC,kBAAmB,OAIvBxC,QAAUjsB,EAAM0uB,cAAcptB,KAAK+H,OAAQ8F,QAG3Cgd,UAAY7qB,KAAK2qB,QAAQ0C,eAGzB9wB,EAAG2C,MAAMc,KAAK6qB,iBACVA,UAAUxrB,QAAQ,SAAAiuB,MACF,IAAbA,IAAgC,IAAdA,GAAmBA,EAAWnX,EAAKpO,OAAOuG,SAAU,KAChEif,EAAcpX,EAAKpO,OAAOtJ,SAASuP,YAErCzR,EAAG+C,QAAQiuB,GAAc,KACnBC,EAAgB,IAAMrX,EAAKpO,OAAOuG,SAAWgf,EAC7CrT,EAAM/X,EAAc,cACfiU,EAAKpO,OAAOM,OAAOmG,WAAWuL,SAGrChU,MAAM+L,KAAU0b,EAAc1kB,WAAlC,MACYtH,YAAYyY,YAWnC0Q,QAAQjE,UAAU1mB,KAAK+H,OAAOoG,aAI9Bwc,QAAQtsB,iBAAiByqB,OAAOkC,IAAImB,aAAaH,KAAKI,SAAU,SAAA1d,UAASyH,EAAKkW,UAAU3d,YAGtF1Q,KAAK8qB,OAAOkC,IAAIyC,QAAQzB,MAAM3sB,QAAQ,SAAAM,KACpCgrB,QAAQtsB,iBAAiByqB,OAAOkC,IAAIyC,QAAQzB,KAAKrsB,GAAO,SAAAjB,UAASyX,EAAKuX,UAAUhvB,YAIpFwsB,QAAQ,4CASPxsB,cACEuG,EAAcjF,KAAK+H,OAAOtJ,SAA1BwG,UAIF0oB,EAAKjvB,EAAMkvB,QAGXhtB,EAAgB,SAAAjB,OACZjB,EAAAA,MAAciB,EAAK6D,QAAQ,KAAM,IAAI8F,gBAC9B9J,KAAK0X,EAAKnP,OAAQmP,EAAKnP,OAAOZ,MAAOzI,WAG9CA,EAAMiB,WACLmpB,OAAOkC,IAAIyC,QAAQzB,KAAK6B,YAGpB3C,QAAQ,YAGCxsB,EAAMiB,WAGfmuB,eAAc,GAEdH,EAAGI,eAEDnc,MAAQ3M,EAAUynB,cAClBrX,OAASpQ,EAAU8R,yBAOzB+R,OAAOkC,IAAIyC,QAAQzB,KAAKgC,oBAKXtvB,EAAMiB,WAyBfsuB,qBAGJnF,OAAOkC,IAAIyC,QAAQzB,KAAKkC,0BAKXxvB,EAAMiB,WAEfwuB,0BAIJrF,OAAOkC,IAAIyC,QAAQzB,KAAKoC,2BAMX1vB,EAAMiB,WAEfmuB,qBAEAO,2BAIJvF,OAAOkC,IAAIyC,QAAQzB,KAAKsC,aACxBxF,OAAOkC,IAAIyC,QAAQzB,KAAKuC,cACxBzF,OAAOkC,IAAIyC,QAAQzB,KAAKwC,cACxB1F,OAAOkC,IAAIyC,QAAQzB,KAAKyC,gBACxB3F,OAAOkC,IAAIyC,QAAQzB,KAAK0C,QACXhwB,EAAMiB,yCAYtBjB,QACDiwB,cACA5mB,OAAOQ,MAAMoG,KAAK,YAAajQ,kDAS5BuG,EAAcjF,KAAK+H,OAAOtJ,SAA1BwG,UACJoH,OAAAA,OAGCtE,OAAOhI,GAAG,QAAS,aACf6qB,OAAOgE,yBAGX7mB,OAAOhI,GAAG,UAAW,oBACf8uB,EAAK9mB,OAAOC,mBAIlBD,OAAOhI,GAAG,SAAU,eACf+uB,EAAaD,EAAK9mB,OAAOC,YAE3BzL,EAAG2C,MAAM2vB,EAAKhE,cAIbA,UAAUxrB,QAAQ,SAACiuB,EAAUrsB,GAC1BoL,EAAOihB,GAAYA,EAAWwB,MACzBnE,QAAQoE,mBACRlE,UAAU/H,OAAO7hB,EAAO,eAOlC5C,iBAAiB,SAAU,WAC1BwwB,EAAKlE,WACAA,QAAQqE,OAAO/pB,EAAUynB,YAAaznB,EAAU8R,aAAc+R,OAAOkC,IAAIiE,SAASC,oDASvFjqB,EAAcjF,KAAK+H,OAAOtJ,SAA1BwG,UAEHjF,KAAK4gB,qBACDyN,qBAIJzN,eACA/U,KAAK,aAEGpN,SAASktB,iBAAiBwD,iBAGtBC,EAAKzO,gBAEDgK,QAAQ0E,KAAKpqB,EAAUynB,YAAaznB,EAAU8R,aAAc+R,OAAOkC,IAAIiE,SAASC,UAIhFvE,QAAQ2E,WAGZ3O,aAAc,EACrB,MAAO4O,KAGAlD,UAAUkD,MAGtBxjB,MAAM,2DAQNtN,SAASwG,UAAUc,MAAMypB,OAAS,QAGlCvnB,SAAU,EAGXjI,KAAK+H,OAAOC,YAAchI,KAAK+H,OAAOuG,eACjCvG,OAAOK,mDASX3J,SAASwG,UAAUc,MAAMypB,OAAS,OAGlCvnB,SAAU,OAGVF,OAAOuF,yCAWRtN,KAAK2gB,kBACA0N,qBAIJnD,QAAQ,cAGR+C,4DAQArN,eACA/U,KAAK,WAEE4jB,EAAK9E,WACAA,QAAQ+E,YAIZ9O,eAAiB,IAAIvJ,QAAQ,SAAAC,KACzBvX,GAAG,SAAUuX,KACbvP,OAAOQ,MAAMC,IAAIinB,EAAK9E,aAI1BkB,eAER9f,MAAM,8CAOPrN,qCAAUyB,EAAMrD,MAAAsD,EAAA,EAAAA,EAAA,EAAA,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,MAAAA,EAAA,GAAAxB,UAAAwB,OACdsvB,EAAW3vB,KAAKP,OAAOf,GAEzBnC,EAAGqB,MAAM+xB,MACAtwB,QAAQ,SAAA8d,GACT5gB,EAAG4C,SAASge,MACJ7c,MAAMsvB,EAAMzvB,gCAYjCzB,EAAOC,UACDpC,EAAGqB,MAAMoC,KAAKP,OAAOf,WACjBe,OAAOf,YAGXe,OAAOf,GAAOoB,KAAKnB,GAEjBqB,8CAWMqM,EAAMjN,mBACd2I,OAAOQ,MAAMC,IAAlB,8BAAoDpJ,QAE/C0rB,YAAc9L,WAAW,aACrB2P,WACAvD,iBAAiB,uBACvB/e,4CAOUjN,GACR7C,EAAGM,gBAAgBmD,KAAK8qB,oBACpB/iB,OAAOQ,MAAMC,IAAlB,8BAAoDpJ,gBAEvCY,KAAK8qB,kBACbA,YAAc,6CAxhBhB9qB,KAAK+H,OAAOT,SAAWtH,KAAK+H,OAAOM,OAAOqY,IAAIrW,UAAY9N,EAAG2C,MAAMc,KAAK0qB,kDA0DrEmF,8CAAQ3X,mBAXE,wCACF,kCACNlL,SAASyL,YACbqX,KAAKC,eACC,cACC,aACD/vB,KAAK0qB,oBAxFrBD,GCJA9iB,mBAAS,SAEIhI,EAAMgC,cACbpF,EAAGkB,OAAOkE,KACIhC,EAAMK,KAAKmH,WAChBxF,IAEFpF,EAAGqB,MAAM+D,MACLtC,QAAQ,SAAA2wB,KACDrwB,EAAMC,EAAKuH,MAAO6oB,aATjC,SAgBJ7zB,cACEI,EAAGwB,OAAO5B,IAAY,YAAaA,GAAWA,EAAMuM,QAAQ5K,UAM3DmyB,eAAezwB,KAAKQ,WAGrB0vB,QAAQlwB,KACTQ,KACA,oBAES7B,QAAQyU,aAGClB,EAAKvK,SACdA,MAAQ,KAGT5K,EAAG+C,QAAQoS,EAAKjT,SAASwG,cACpBxG,SAASwG,UAAUf,gBAAgB,WAIvCvE,KAAOxD,EAAMwD,OACb6G,SAAYjK,EAAG2C,MAAM/C,EAAMuM,QAAQ,GAAGlC,UAAwC8T,GAAU7S,MAAtCtL,EAAMuM,QAAQ,GAAGlC,WAGnEtI,UAAYqI,EAAQ2pB,MAAMxe,EAAK/R,KAAM+R,EAAKlL,SAAUkL,EAAKrJ,OAAO5B,aAG1DiL,EAAKlL,SAAhB,IAA4BkL,EAAK/R,UACxB,gBACIwH,MAAQjF,EAAc,mBAG1B,gBACIiF,MAAQjF,EAAc,mBAG1B,oBACA,gBACIiF,MAAQjF,EAAc,WAClB/F,EAAMuM,QAAQ,GAAGR,QAS7BzJ,SAASwG,UAAUzD,YAAYkQ,EAAKvK,OAGrC5K,EAAGyH,QAAQ7H,EAAM6pB,cACZ3d,OAAO2d,SAAW7pB,EAAM6pB,UAI7BtU,EAAKtK,UACDsK,EAAKrJ,OAAO8nB,eACPhpB,MAAMlF,aAAa,cAAe,IAEvCyP,EAAKrJ,OAAO2d,YACP7e,MAAMlF,aAAa,WAAY,IAEnC1F,EAAG2C,MAAM/C,EAAM+hB,YACXA,OAAS/hB,EAAM+hB,QAEpBxM,EAAKrJ,OAAOsV,KAAK3J,UACZ7M,MAAMlF,aAAa,OAAQ,IAEhCyP,EAAKrJ,OAAOsI,SACPxJ,MAAMlF,aAAa,QAAS,IAEjCyP,EAAKrJ,OAAO5B,eACPU,MAAMlF,aAAa,cAAe,QAK5CmuB,aAAa5wB,KAAKkS,GAGjBA,EAAKtK,YACEipB,eAAe7wB,KAAKkS,EAAM,SAAUvV,EAAMuM,WAIhDL,OAAO2B,MAAQ7N,EAAM6N,SAGpB0T,MAAMle,KAAKkS,GAGbA,EAAKtK,UAED,WAAYjL,MACLk0B,eAAe7wB,KAAKkS,EAAM,QAASvV,EAAMyX,UAI/CzM,MAAMgB,SAIXuJ,EAAKtK,SAAYsK,EAAK4M,UAAY5M,EAAKxT,UAAUyI,QAE9C0hB,MAAM7oB,KAAKkS,KAIb3D,WAAWzC,WAEpB,SAnHK/C,MAAMoG,KAAK,2BCG5B2hB,GAAAA,sBACA7qB,EAAAtH,gCACA4gB,eAGAf,OAAA,OACAc,SAAA,OACAyR,QAAA,OAGA5e,MAAApL,EAAAoL,WAGAxK,MAAA1B,EAGAlJ,EAAAkB,OAAAuC,KAAAmH,cACAA,MAAA/E,SAAA0C,iBAAA9E,KAAAmH,SAIA9J,OAAAmzB,QAAAxwB,KAAAmH,iBAAAqpB,QAAAj0B,EAAAsB,SAAAmC,KAAAmH,QAAA5K,EAAAqB,MAAAoC,KAAAmH,eAEAA,MAAAnH,KAAAmH,MAAA,SAIAkB,OAAAI,KAEA4R,GACAiW,EAAAjW,SACAlc,MACA,sBAEAwM,KAAAC,MAAAhL,EAAAuH,MAAAxB,aAAA,qBACA,MAAApH,aAHA,SAUAE,oBACA,gEAMA,gCAIA,WAIAqP,iBACA,mBACA,OACA,IAAA9Q,cAIA+Q,oBACA,QAIA5P,mCAOAoK,MAAA,IAAAkS,GAAAza,KAAAqI,OAAAE,YAGAA,MAAAC,IAAA,SAAAxI,KAAAqI,aACAE,MAAAC,IAAA,UAAAjC,IAGAhK,EAAAM,gBAAAmD,KAAAmH,QAAA5K,EAAA+C,QAAAU,KAAAmH,UAMAnH,KAAAmH,MAAAspB,UACAloB,MAAAoG,KAAA,gCAKA3O,KAAAqI,OAAAgC,WAOA9D,EAAA2pB,QAAAxpB,SAMAsO,EAAAhV,KAAAmH,MAAAhG,WAAA,KACA6kB,UAAA,OACAvnB,SAAAiyB,SAAA1b,MAIArV,EAAAK,KAAAmH,MAAAwpB,QAAArnB,cAGAiV,EAAA,KACArT,EAAA,YAGAvL,OACA,WAEAK,KAAAmH,MAAAhC,cAAA,UAGA5I,EAAA+C,QAAAif,SAEAxG,EAAAwG,EAAA5Y,aAAA,aACAa,SbhJA,SAAiC0E,SAEzB,wDAAwDvN,KAAKuN,GACtDoP,GAAUkO,QAIjB,wDAAwD7qB,KAAKuN,GACtDoP,GAAUgL,MAGd,KaqIXsL,CAAA1lB,EAAApC,iBAGArK,SAAAwG,UAAAjF,KAAAmH,WACAA,MAAAoX,OAGA9f,SAAAwG,UAAA1B,UAAA,GAGA2H,EAAA2lB,aAAA/yB,OAAA,KACAgzB,GACA,IACA,QAGAA,EAAA/rB,SAAAmG,EAAA2lB,aAAAhmB,IAAA,oBACAxC,OAAA2d,UAAA,GAEA8K,EAAA/rB,SAAAmG,EAAA2lB,aAAAhmB,IAAA,gBACAxC,OAAAsV,KAAA3J,QAAA,GAKAhU,KAAAsY,e/B5FAjQ,OAAA5B,YAAAqqB,EAAA/rB,SAAAmG,EAAA2lB,aAAAhmB,IAAA,qB+B+FAxC,OAAA5B,aAAA,aAKAD,SAAAxG,KAAAmH,MAAAxB,aAAA3F,KAAAqI,OAAA1G,WAAA6X,MAAAhT,eAGAW,MAAAjD,gBAAAlE,KAAAqI,OAAA1G,WAAA6X,MAAAhT,aAIAjK,EAAA2C,MAAAc,KAAAwG,YAAAhK,OAAAwB,KAAAsc,IAAAvV,SAAA/E,KAAAwG,2BACA+B,MAAAmG,MAAA,uCAKA/O,KAAA4a,GAAAzT,gBAIA,YACA,aACAnH,KAAAA,OACA6G,SAAA8T,GAAA7S,MAGAzH,KAAAmH,MAAAlD,aAAA,sBACAoE,OAAA8nB,aAAA,GAEAnwB,KAAAmH,MAAAlD,aAAA,mBACAoE,OAAA2d,UAAA,GAEAhmB,KAAAmH,MAAAlD,aAAA,sBACAoE,OAAA5B,aAAA,GAEAzG,KAAAmH,MAAAlD,aAAA,gBACAoE,OAAAsI,OAAA,GAEA3Q,KAAAmH,MAAAlD,aAAA,eACAoE,OAAAsV,KAAA3J,QAAA,kCAMAzL,MAAAmG,MAAA,uCAKAxQ,UAAAqI,EAAA2pB,MAAAlwB,KAAAL,KAAAK,KAAAwG,SAAAxG,KAAAqI,OAAA5B,aAGAzG,KAAA9B,UAAAwI,UAKA7G,uBAGA2d,UAAA,IAAA2B,GAAAnf,WAGAsK,QAAA,IAAAF,EAAApK,WAGAmH,MAAAspB,KAAAzwB,KAGAzD,EAAA+C,QAAAU,KAAAvB,SAAAwG,kBACAxG,SAAAwG,UAAA/C,EAAA,SACAlC,KAAAmH,MAAAnH,KAAAvB,SAAAwG,iBAIAxG,SAAAwG,UAAAhD,aAAA,WAAA,MAGAmuB,aAAA5wB,KAAAQ,SAGA0d,MAAAle,KAAAQ,MAGAA,KAAAqI,OAAAE,SACA/I,KAAAQ,KAAAA,KAAAvB,SAAAwG,UAAAjF,KAAAqI,OAAA5I,OAAAwX,KAAA,KAAA,SAAAvY,KACA6J,MAAAC,IAAA,UAAA9J,EAAAiB,SAMAK,KAAAoH,SAAApH,KAAAse,UAAAte,KAAA9B,UAAAyI,QACA0hB,MAAA7oB,KAAAQ,WAIAwd,UAAAvY,iBAGAuY,UAAA4C,cAGArS,WAAA,IAAA8N,GAAA7b,WAGA0gB,IAAA,IAAA+J,GAAAzqB,MAGAA,KAAAqI,OAAA2d,e9B/SA5d,a8BuPAG,MAAAmG,MAAA,sCA/GAnG,MAAAmG,MAAA,sCAPAnG,MAAAmG,MAAA,8CAZAnG,MAAAmG,MAAA,4FA6NAnS,EAAA4C,SAAAa,KAAAmH,MAAAiB,MAKApI,KAAAmH,MAAAiB,OAJA,qCAWApI,KAAAiI,SAAA1L,EAAA4C,SAAAa,KAAAmH,MAAAmG,aAIAnG,MAAAmG,2CAmCAnR,IAEAI,EAAAyH,QAAA7H,GAAAA,GAAA6D,KAAAiI,cAGAG,YAEAkF,uCAQAtN,KAAAoH,cACAkG,a9B1SAC,W8B4SAhR,EAAA4C,SAAAa,KAAAmH,MAAAqf,YACArf,MAAAqf,8CAQAxe,YAAA,iCAOA+B,QACA/B,YAAAhI,KAAAgI,aAAAzL,EAAAiQ,OAAAzC,GAAAA,EAAA/J,KAAAqI,OAAA0B,0CAOAA,QACA/B,YAAAhI,KAAAgI,aAAAzL,EAAAiQ,OAAAzC,GAAAA,EAAA/J,KAAAqI,OAAA0B,iDA+HAgnB,OACA5iB,EAAAnO,KAAAmH,MAAAwJ,MAAA,EAAA3Q,KAAAmO,YACAA,OAAAA,GAAA5R,EAAAiQ,OAAAukB,GAAAA,EAAA,0CAOAA,OACA5iB,EAAAnO,KAAAmH,MAAAwJ,MAAA,EAAA3Q,KAAAmO,YACAA,OAAAA,GAAA5R,EAAAiQ,OAAAukB,GAAAA,EAAA,0CAwQA50B,MAEA6D,KAAA9B,UAAAyI,QAKAqN,EAAAzX,EAAAyH,QAAA7H,GAAAA,GAAA6D,KAAAvB,SAAAwG,UAAAX,UAAAC,SAAAvE,KAAAqI,OAAAmG,WAAAV,SAAAkG,UAGAhU,KAAAvB,SAAA4O,QAAAS,SAAAkG,KAGAhU,KAAAvB,SAAAwG,UAAAjF,KAAAqI,OAAAmG,WAAAV,SAAAkG,OAAAA,GAGAA,IAAAhU,KAAA8N,SAAAkG,cACAlG,SAAAkG,OAAAA,IACAxU,KAAAQ,KAAAA,KAAAmH,MAAAnH,KAAA8N,SAAAkG,OAAA,kBAAA,wDA4EAzN,EAAAqH,cACAzG,MAAA6pB,wEAQApyB,MAEAoB,KAAA9B,UAAAyI,KAAA3G,KAAAuH,QAAA,KAEA0pB,EAAAzsB,EAAAxE,KAAAvB,SAAAwG,UAAAjF,KAAAqI,OAAAmG,WAAAyQ,cAGA7a,OAAA,IAAAxF,OAAAE,GAAAF,EAGAsyB,EAAA/sB,EAAAnE,KAAAvB,SAAAwG,UAAAjF,KAAAqI,OAAAmG,WAAAyQ,aAAA7a,MAGA8sB,GAAAlxB,KAAAqI,OAAAuE,SAAA7H,SAAA,cAAAxI,EAAA2C,MAAAc,KAAAqI,OAAAwF,aACAyR,WAAA9f,KAAAQ,MAAA,GAGAkxB,IAAAD,EAAA,KACAE,EAAAD,EAAA,iBAAA,kBxB37BA1xB,KAAAQ,KAAAA,KAAAmH,MAAAgqB,UwB87BAD,SAEA,6BAQAxyB,EAAAC,KACAa,KAAAQ,KAAAA,KAAAvB,SAAAwG,UAAAvG,EAAAC,gCAOAD,EAAAC,KACAqB,KAAAvB,SAAAwG,UAAAvG,EAAAC,+BAOAD,EAAAC,KACAqB,KAAAvB,SAAAwG,UAAAvG,EAAAC,mCAUAA,cAAAyyB,EAAAvyB,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,IAAAA,UAAA,MACAmB,KAAAge,WAIA4D,EAAA,oBAEArc,KAAAQ,MAAA4V,SAAA,KAGAnC,MAAA,KAGA4X,GACA50B,OAAAwB,KAAA0T,EAAAjT,UAAAX,WAEA4T,EAAAjT,SAAA4O,QAAAjF,QACAsJ,EAAAjT,SAAAqP,YACA4D,EAAAjT,SAAAmO,YACA8E,EAAAjT,SAAAqC,WAGArC,SAAA4O,QAAAjF,KAAA,OACA3J,SAAAqP,SAAA,OACArP,SAAAmO,SAAA,OACAnO,SAAAqC,QAAA,MAIAvE,EAAA4C,SAAAR,U/B74BA,WACQqB,MAAQA,KAAKH,sBACRA,eAAeR,QAAQ,SAAA6K,OAChBzL,EAAsCyL,EAAtCzL,SAAUkB,EAA4BuK,EAA5BvK,KAAMhB,EAAsBuL,EAAtBvL,SAAUR,EAAY+L,EAAZ/L,UACzBG,oBAAoBqB,EAAMhB,EAAUR,UAG5C0B,oB+B24BbL,KAAAkS,KAGAA,EAAAjT,SAAAiyB,SAAAhf,EAAAjT,SAAAwG,aAGAzF,KAAAkS,EAAAA,EAAAjT,SAAAiyB,SAAA,aAAA,GxBv8BAn0B,EAAA4C,SAAAR,MwB28BAa,KAAAkS,EAAAjT,SAAAiyB,YAIA1S,OAAA,aAGA,axBz8BAvf,SAAA,OwB28BA0I,MAAA,MACA,mBvBxhCAqf,OuBgiCAxmB,KAAAwG,SAAA,IAAAxG,KAAAL,UACA,kBACA,2BAEAK,KAAA+e,OAAAD,YAGAlQ,qBAAApP,KAAAQ,MAAA,iBAOA,8BAEAA,KAAA+e,OAAAkL,yBACAjqB,KAAA+e,OAAA9W,SAGA,OAAAjI,KAAAwZ,OAAAjd,EAAA4C,SAAAa,KAAAwZ,MAAAkW,eACAlW,MAAAkW,wBAQA,cAGA,OAAA1vB,KAAAwZ,YtB1jCAA,MAAA6X,SAAAxlB,KAAA+V,csB+jCAA,EAAA,wCAaAjiB,UACA4G,EAAAqB,KAAApI,KAAAQ,KAAAL,0CAxxBArD,QAAA0D,KAAAwG,WAAA8T,GAAA7S,8CAGAnL,QAAA0D,KAAAsY,WAAAtY,KAAAqU,kDAGA/X,QAAA0D,KAAAwG,WAAA8T,GAAAkO,gDAGAlsB,QAAA0D,KAAAwG,WAAA8T,GAAAgL,8CAGAhpB,QAAA0D,KAAAL,OAAA4a,GAAAzT,8CAGAxK,QAAA0D,KAAAL,OAAA4a,GAAAvT,8CA8BA1K,QAAA0D,KAAAge,QAAAhe,KAAAuS,SAAAvS,KAAA8gB,6CAOAxkB,QAAA0D,KAAAmH,MAAAoL,+C9BnSAjW,QAAA0D,KAAAuS,QAAA,IAAAvS,KAAAgI,kD8BiTA1L,QAAA0D,KAAAmH,MAAA2Z,yCAyDA3kB,MAEA6D,KAAAsO,cAKAgjB,EAAA/0B,EAAAiQ,OAAArQ,IAAAA,EAAA,OAGAgL,MAAAa,YAAAspB,EAAA9a,KAAA+a,IAAAp1B,EAAA6D,KAAAsO,UAAA,OAGA/F,MAAAC,IAAA,cAAAxI,KAAAgI,YAAA,oCAOAvL,OAAAuD,KAAAmH,MAAAa,kDAOAiJ,EAAAjR,KAAAmH,MAAA8J,gBAGA1U,EAAAiQ,OAAAyE,GACAA,EAMAA,GAAAA,EAAAnT,QAAAkC,KAAAsO,SAAA,EACA2C,EAAAugB,IAAA,GAAAxxB,KAAAsO,SAGA,yCAOAhS,QAAA0D,KAAAmH,MAAAgL,8CAQAsf,EAAA1f,WAAA/R,KAAAqI,OAAAiG,UAGAA,GAAAtO,KAAAmH,WAAAmH,UAAA,SAGAmjB,GAAAnjB,+B9BpSAtM,O8B4SAmM,EAAAnM,E9BvSAzF,EAAAkB,OAAA0Q,O8B4SA1R,OAAA0R,IAIA5R,EAAAiQ,OAAA2B,OACAnO,KAAAsK,QAAAO,IAAA,WAIAtO,EAAAiQ,OAAA2B,OACAnO,KAAAqI,OAAA8F,QAIAA,EAlBA,MAAA,GAsBAA,EArBA,MAAA,QA0BA9F,OAAA8F,OAAAA,OAGAhH,MAAAgH,OAAAA,GAGA5R,EAAA2C,MAAA8C,IAAAhC,KAAA2Q,OAAAxC,EAAA,SACAwC,OAAA,0BAQAlU,OAAAuD,KAAAmH,MAAAgH,oCAyBAT,OACA9O,EAAA8O,EAGAnR,EAAAyH,QAAApF,OACAoB,KAAAsK,QAAAO,IAAA,UAIAtO,EAAAyH,QAAApF,OACAoB,KAAAqI,OAAAsI,YAIAtI,OAAAsI,MAAA/R,OAGAuI,MAAAwJ,MAAA/R,yBAOAtC,QAAA0D,KAAAmH,MAAAwJ,+CAQA3Q,KAAAoH,Y7BhmBApH,KAAAuH,U6B0mBAjL,QAAA0D,KAAAmH,MAAAuqB,cACAp1B,QAAA0D,KAAAmH,MAAAwqB,8BACAr1B,QAAA0D,KAAAmH,MAAAyqB,aAAA5xB,KAAAmH,MAAAyqB,YAAA9zB,sCAQA3B,OACAiY,EAAA,K7B/lBA7X,EAAAiQ,OAAArQ,O6BkmBAA,GAGAI,EAAAiQ,OAAA4H,OACApU,KAAAsK,QAAAO,IAAA,U5B7nBAtO,EAAAiQ,OAAA4H,O4BioBApU,KAAAqI,OAAA+L,MAAAwS,U5B5nBAxS,EAAA,O4BioBA,IAEAA,EAAA,MACA,G3BzoBApU,KAAAqI,OAAA+L,MAAAjW,QAAA4G,SAAAqP,S2BkpBA/L,OAAA+L,MAAAwS,SAAAxS,OAGAjN,MAAAqiB,aAAApV,Q3BppBA7L,MAAAoG,KAAA,sBAAAyF,EAAA,4B2B2pBA3X,OAAAuD,KAAAmH,MAAAqiB,4CAQArtB,OACAkM,EAAArI,KAAAqI,OAAAuK,QACAzU,EAAA6B,KAAA7B,QAAAyU,WAEAzU,EAAAL,YAIA8U,IACArW,EAAA2C,MAAA/C,IAAAM,OAAAN,GACA6D,KAAAsK,QAAAO,IAAA,WACAxC,EAAAue,SACAve,EAAAsL,SACA7N,KAAAvJ,EAAAiQ,YAEArO,EAAA4G,SAAA6N,GAAA,KACA5Q,EtBpqBA,SAAwBpE,EAAOoE,UACtBzF,EAAGqB,MAAMA,IAAWA,EAAME,OAIxBF,EAAMiM,OAAO,SAACgoB,EAAMC,UAAUtb,KAAKub,IAAID,EAAO9vB,GAASwU,KAAKub,IAAIF,EAAO7vB,GAAS8vB,EAAOD,IAHnF,KsBkqBfG,CAAA7zB,EAAAyU,QACArK,MAAAoG,KAAA,+BAAAiE,EAAA,WAAA5Q,EAAA,cACAA,IAIAxC,KAAAQ,KAAAA,KAAAmH,MAAA,oBAAA,GAAAyL,QAAAA,MAGAgU,SAAAhU,OAGAzL,MAAAyL,QAAAA,0BAOA5S,KAAAmH,MAAAyL,mCAQAzW,OACAyC,EAAArC,EAAAyH,QAAA7H,GAAAA,EAAA6D,KAAAqI,OAAAsV,KAAA3J,YACA3L,OAAAsV,KAAA3J,OAAApV,OACAuI,MAAAwW,KAAA/e,yBAkDAtC,QAAA0D,KAAAmH,MAAAwW,mCAOAxhB,MACA81B,OAAAzyB,KAAAQ,KAAA7D,0BAOA6D,KAAAmH,MAAA4f,wCAOA5qB,GACA6D,KAAAsH,WAKA8W,UAAA5e,KAAAQ,KAAA7D,QAJAoM,MAAAoG,KAAA,2DAWA3O,KAAAsH,QAIAtH,KAAAmH,MAAAxB,aAAA,UAHA,oCAUAxJ,OACAyC,EAAArC,EAAAyH,QAAA7H,GAAAA,EAAA6D,KAAAqI,OAAA2d,cACA3d,OAAA2d,SAAApnB,yBAOAtC,QAAA0D,KAAAqI,OAAA2d,6CAiCA7pB,MACAkc,IAAA7Y,KAAAQ,KAAA7D,yBAOA6D,KAAA8N,SAAAkG,EADAgF,EACAhF,OAAAN,EADAsF,EACAtF,oBACAM,EAAAN,GAAA,iCAQAvX,MACA2c,YAAAtZ,KAAAQ,KAAA7D,0BAOA2R,GAAAyL,gBAAA/Z,KAAAQ,WAAAiU,mCAQA9X,OACA+1B,EACA,qBADAA,EAEA,YAIA3rB,EAAAoH,SAKA/O,EAAArC,EAAAyH,QAAA7H,GAAAA,EAAA6D,KAAA2N,MAAAukB,OAGA/qB,MAAAF,0BAAArI,EAAAszB,EAAAA,2BAOA3rB,EAAAoH,IAIA3N,KAAAmH,MAAAgrB,uBAHA,yCAyMAxyB,EAAA6G,EAAA4rB,UACA7rB,EAAA2pB,MAAAvwB,EAAA6G,EAAA4rB,sCAQAlnB,EAAAtH,UACAqH,EAAAC,EAAAtH,iCAQAP,OAAAlF,EAAAU,UAAAf,OAAA,QAAAgB,IAAAD,UAAA,GAAAA,UAAA,MACAkC,EAAA,YAEAxE,EAAAkB,OAAA4F,KACAvG,MAAAsC,KAAAgD,SAAA0C,iBAAAzB,IACA9G,EAAAsB,SAAAwF,KACAvG,MAAAsC,KAAAiE,GACA9G,EAAAqB,MAAAyF,OACAA,EAAAqE,OAAAnL,EAAA+C,UAGA/C,EAAA2C,MAAA6B,GACA,KAGAA,EAAA+G,IAAA,SAAAuqB,UAAA,IAAA/B,EAAA+B,EAAAl0B,WA7lCAmyB,UAimCAA,GAAAjW,UzB3nC0Btc,GyB2nC1Bsc,GzB1nCW1P,KAAKC,MAAMD,KAAKI,UAAUhN","file":"plyr.min.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 && !once) {\n // Cache event listener\n this.eventListeners.push({ elements, type, callback, options });\n }\n\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport 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\nexport 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\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener(element, events, onceCallback, true, passive, capture, true);\n}\n\n// Trigger event\nexport 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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { elements, type, callback, options } = item;\n elements.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\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.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { once } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n };\n\n // Listen for the transition finishing and restore auto height/width\n once(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\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 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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\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 onChange.call(this);\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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on.call(this.player, this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on.call(this.player, this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(this.player, element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = 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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\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\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\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\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 setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n triggerEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = ([\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ]).find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once(this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file diff --git a/dist/plyr.polyfilled.js b/dist/plyr.polyfilled.js index d5cfbc6e..f4bfd4a6 100644 --- a/dist/plyr.polyfilled.js +++ b/dist/plyr.polyfilled.js @@ -5484,7 +5484,11 @@ var supportsPassiveListeners = function () { function toggleListener(elements, event, callback) { var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + + var _this = this; + var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + var once = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false; // Bail if no elemetns, event, or callback if (is$1.empty(elements) || is$1.empty(event) || !is$1.function(callback)) { @@ -5522,6 +5526,11 @@ function toggleListener(elements, event, callback) { // If a single node is passed, bind the event listener events.forEach(function (type) { + if (_this && _this.eventListeners && toggle && !once) { + // Cache event listener + _this.eventListeners.push({ elements: elements, type: type, callback: callback, options: options }); + } + elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); }); } @@ -5533,7 +5542,7 @@ function on(element) { var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener(element, events, callback, true, passive, capture); + toggleListener.call(this, element, events, callback, true, passive, capture); } // Unbind event handler @@ -5543,11 +5552,31 @@ function off(element) { var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - toggleListener(element, events, callback, false, passive, capture); + toggleListener.call(this, element, events, callback, false, passive, capture); +} + +// Bind once-only event handler +function once(element) { + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var callback = arguments[2]; + var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + function onceCallback() { + off(element, events, onceCallback, passive, capture); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + } + + toggleListener(element, events, onceCallback, true, passive, capture, true); } // Trigger event -function trigger(element) { +function triggerEvent(element) { var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; @@ -5569,6 +5598,22 @@ function trigger(element) { element.dispatchEvent(event); } +// Unbind all cached event listeners +function unbindListeners() { + if (this && this.eventListeners) { + this.eventListeners.forEach(function (item) { + var elements = item.elements, + type = item.type, + callback = item.callback, + options = item.options; + + elements.removeEventListener(type, callback, options); + }); + + this.eventListeners = []; + } +} + var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); @@ -5994,8 +6039,6 @@ var browser = { isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform) }; -var browser$1 = { browser: browser }; - // ========================================================================== // Check for feature support @@ -6009,12 +6052,12 @@ var support = { check: function check(type, provider, playsinline) { var api = false; var ui = false; - var canPlayInline = browser$1.isIPhone && playsinline && support.playsinline; + var canPlayInline = browser.isIPhone && playsinline && support.playsinline; switch (provider + ':' + type) { case 'html5:video': api = support.video; - ui = api && support.rangeInput && (!browser$1.isIPhone || canPlayInline); + ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline); break; case 'html5:audio': @@ -6025,7 +6068,7 @@ var support = { case 'youtube:video': case 'vimeo:video': api = true; - ui = support.rangeInput && (!browser$1.isIPhone || canPlayInline); + ui = support.rangeInput && (!browser.isIPhone || canPlayInline); break; default: @@ -6043,7 +6086,7 @@ var support = { // Picture-in-picture support // Safari only currently pip: function () { - return !browser$1.isIPhone && is$1.function(createElement('video').webkitSetPresentationMode); + return !browser.isIPhone && is$1.function(createElement('video').webkitSetPresentationMode); }(), // Airplay support @@ -6135,67 +6178,29 @@ var support = { // ========================================================================== -// Remove duplicates in an array -function dedupe(array) { - if (!is$1.array(array)) { - return array; - } - - return array.filter(function (item, index) { - return array.indexOf(item) === index; - }); -} - -// Get the closest value in an array -function closest(array, value) { - if (!is$1.array(array) || !array.length) { - return null; - } - - return array.reduce(function (prev, curr) { - return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; - }); -} - -// ========================================================================== - var html5 = { getSources: function getSources() { - if (!this.isHTML5) { - return null; - } - - return this.media.querySelectorAll('source'); - }, - + var _this = this; - // Get quality levels - getQualityOptions: function getQualityOptions() { if (!this.isHTML5) { - return null; + return []; } - // Get sources - var sources = html5.getSources.call(this); - - if (is$1.empty(sources)) { - return null; - } + var sources = Array.from(this.media.querySelectorAll('source')); - // Get <source> with size attribute - var sizes = Array.from(sources).filter(function (source) { - return !is$1.empty(source.getAttribute('size')); + // Filter out unsupported sources + return sources.filter(function (source) { + return support.mime.call(_this, source.getAttribute('type')); }); + }, - // If none, bail - if (is$1.empty(sizes)) { - return null; - } - // Reduce to unique list - return dedupe(sizes.map(function (source) { + // Get quality levels + getQualityOptions: function getQualityOptions() { + // Get sizes from <source> elements + return html5.getSources.call(this).map(function (source) { return Number(source.getAttribute('size')); - })); + }).filter(Boolean); }, extend: function extend() { if (!this.isHTML5) { @@ -6210,67 +6215,44 @@ var html5 = { // Get sources var sources = html5.getSources.call(player); - if (is$1.empty(sources)) { - return null; - } - - var matches$$1 = Array.from(sources).filter(function (source) { + var _sources$filter = sources.filter(function (source) { return source.getAttribute('src') === player.source; - }); + }), + _sources$filter2 = slicedToArray(_sources$filter, 1), + source = _sources$filter2[0]; - if (is$1.empty(matches$$1)) { - return null; - } + // Return size, if match is found - return Number(matches$$1[0].getAttribute('size')); + + return source && Number(source.getAttribute('size')); }, set: function set(input) { // Get sources var sources = html5.getSources.call(player); - if (is$1.empty(sources)) { - return; - } - - // Get matches for requested size - var matches$$1 = Array.from(sources).filter(function (source) { + // Get first match for requested size + var source = sources.find(function (source) { return Number(source.getAttribute('size')) === input; }); - // No matches for requested size - if (is$1.empty(matches$$1)) { + // No matching source found + if (!source) { return; } - // Get supported sources - var supported = matches$$1.filter(function (source) { - return support.mime.call(player, source.getAttribute('type')); - }); - - // No supported sources - if (is$1.empty(supported)) { - return; - } - - // Trigger change event - trigger.call(player, player.media, 'qualityrequested', false, { - quality: input - }); - // Get current state var currentTime = player.currentTime, playing = player.playing; // Set new source - player.media.src = supported[0].getAttribute('src'); + player.media.src = source.getAttribute('src'); // Restore time var onLoadedMetaData = function onLoadedMetaData() { player.currentTime = currentTime; - player.off('loadedmetadata', onLoadedMetaData); }; - player.on('loadedmetadata', onLoadedMetaData); + player.once('loadedmetadata', onLoadedMetaData); // Load new source player.media.load(); @@ -6281,7 +6263,7 @@ var html5 = { } // Trigger change event - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: input }); } @@ -6297,7 +6279,7 @@ var html5 = { } // Remove child sources - removeElement(html5.getSources()); + removeElement(html5.getSources.call(this)); // Set blank video src attribute // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error @@ -6494,6 +6476,30 @@ var i18n = { // ========================================================================== +// Remove duplicates in an array +function dedupe(array) { + if (!is$1.array(array)) { + return array; + } + + return array.filter(function (item, index) { + return array.indexOf(item) === index; + }); +} + +// Get the closest value in an array +function closest(array, value) { + if (!is$1.array(array) || !array.length) { + return null; + } + + return array.reduce(function (prev, curr) { + return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; + }); +} + +// ========================================================================== + var Storage = function () { function Storage(player) { classCallCheck(this, Storage); @@ -6692,7 +6698,7 @@ var controls = { // Get icon URL getIconUrl: function getIconUrl() { var url = new URL(this.config.iconUrl, window.location); - var cors = url.host !== window.location.host || browser$1.isIE && !window.svg4everybody; + var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody; return { url: this.config.iconUrl, @@ -7194,7 +7200,7 @@ var controls = { range.setAttribute('aria-valuenow', range.value); // WebKit only - if (!browser$1.isWebkit) { + if (!browser.isWebkit) { return; } @@ -7307,7 +7313,6 @@ var controls = { // Set the quality menu - // TODO: Vimeo support setQualityMenu: function setQualityMenu(options) { var _this3 = this; @@ -7319,9 +7324,9 @@ var controls = { var type = 'quality'; var list = this.elements.settings.panes.quality.querySelector('ul'); - // Set options if passed and filter based on config + // Set options if passed and filter based on uniqueness and config if (is$1.array(options)) { - this.options.quality = options.filter(function (quality) { + this.options.quality = dedupe(options).filter(function (quality) { return _this3.config.quality.options.includes(quality); }); } @@ -7742,13 +7747,10 @@ var controls = { // Revert back to auto container.style.width = ''; container.style.height = ''; - - // Only listen once - off(container, transitionEndEvent, restore); }; // Listen for the transition finishing and restore auto height/width - on(container, transitionEndEvent, restore); + once(container, transitionEndEvent, restore); // Set dimensions to target container.style.width = size.width + 'px'; @@ -8253,7 +8255,7 @@ var captions = { // Fix IE captions if CORS is used // Fetch captions and inject as blobs instead (data URIs not supported!) - if (browser$1.isIE && window.URL) { + if (browser.isIE && window.URL) { var elements = this.media.querySelectorAll('track'); Array.from(elements).forEach(function (track) { @@ -8293,7 +8295,7 @@ var captions = { // Watch changes to textTracks and update captions menu if (this.isHTML5) { var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; - on(this.media.textTracks, trackEvents, captions.update.bind(this)); + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); } // Update available languages in list next tick (the event must not be triggered before the listeners) @@ -8324,7 +8326,7 @@ var captions = { track.mode = 'hidden'; // Add event listener for cue changes - on(track, 'cuechange', function () { + on.call(_this, track, 'cuechange', function () { return captions.updateCues.call(_this); }); }); @@ -8395,7 +8397,7 @@ var captions = { } // Trigger event - trigger.call(this, this.media, 'languagechange'); + triggerEvent.call(this, this.media, 'languagechange'); } if (this.isHTML5 && this.isVideo) { @@ -8531,7 +8533,7 @@ var captions = { this.elements.captions.appendChild(caption); // Trigger event - trigger.call(this, this.media, 'cuechange'); + triggerEvent.call(this, this.media, 'cuechange'); } } }; @@ -8957,10 +8959,10 @@ function onChange() { } // Trigger an event - trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container - if (!browser$1.isIos) { + if (!browser.isIos) { trapFocus.call(this.player, this.target, this.active); } } @@ -9006,13 +9008,13 @@ var Fullscreen = function () { // Register event listeners // Handle event (incase user presses escape etc) - on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () { + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : this.prefix + 'fullscreenchange', function () { // TODO: Filter for target?? onChange.call(_this); }); // Fullscreen toggle on double click - on(this.player.elements.container, 'dblclick', function (event) { + on.call(this.player, this.player.elements.container, 'dblclick', function (event) { // Ignore double click in controls if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) { return; @@ -9054,7 +9056,7 @@ var Fullscreen = function () { } // iOS native fullscreen doesn't need the request step - if (browser$1.isIos && this.player.config.fullscreen.iosNative) { + if (browser.isIos && this.player.config.fullscreen.iosNative) { if (this.player.playing) { this.target.webkitEnterFullscreen(); } @@ -9077,7 +9079,7 @@ var Fullscreen = function () { } // iOS native fullscreen - if (browser$1.isIos && this.player.config.fullscreen.iosNative) { + if (browser.isIos && this.player.config.fullscreen.iosNative) { this.target.webkitExitFullscreen(); this.player.play(); } else if (!Fullscreen.native) { @@ -9134,7 +9136,7 @@ var Fullscreen = function () { }, { key: 'target', get: function get() { - return browser$1.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; } }], [{ key: 'native', @@ -9286,7 +9288,7 @@ var ui = { toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class - toggleClass(this.elements.container, this.config.classNames.isIos, browser$1.isIos); + toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); @@ -9296,7 +9298,7 @@ var ui = { // Ready event at end of execution stack setTimeout(function () { - trigger.call(_this, _this.media, 'ready'); + triggerEvent.call(_this, _this.media, 'ready'); }, 0); // Set the title @@ -9621,9 +9623,6 @@ var Listeners = function () { // Add touch class toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true); - - // Clean up - off(document.body, 'touchstart', this.firstTouch); } // Global window & document listeners @@ -9635,14 +9634,14 @@ var Listeners = function () { // Keyboard shortcuts if (this.player.config.keyboard.global) { - toggleListener(window, 'keydown keyup', this.handleKey, toggle, false); + toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false); } // Click anywhere closes menu - toggleListener(document.body, 'click', this.toggleMenu, toggle); + toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events - on(document.body, 'touchstart', this.firstTouch); + once(document.body, 'touchstart', this.firstTouch); } // Container listeners @@ -9654,17 +9653,16 @@ var Listeners = function () { // Keyboard shortcuts if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) { - on(this.player.elements.container, 'keydown keyup', this.handleKey, false); + on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false); } // Detect tab focus // Remove class on blur/focusout - on(this.player.elements.container, 'focusout', function (event) { + on.call(this.player, this.player.elements.container, 'focusout', function (event) { toggleClass(event.target, _this2.player.config.classNames.tabFocus, false); }); - // Add classname to tabbed elements - on(this.player.elements.container, 'keydown', function (event) { + on.call(this.player, this.player.elements.container, 'keydown', function (event) { if (event.keyCode !== 9) { return; } @@ -9677,7 +9675,7 @@ var Listeners = function () { }); // Toggle controls on mouse events and entering fullscreen - on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { + on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) { var controls$$1 = _this2.player.elements.controls; // Remove button states for fullscreen @@ -9715,24 +9713,24 @@ var Listeners = function () { var _this3 = this; // Time change on media - on(this.player.media, 'timeupdate seeking seeked', function (event) { + on.call(this.player, this.player.media, 'timeupdate seeking seeked', function (event) { return controls.timeUpdate.call(_this3.player, event); }); // Display duration - on(this.player.media, 'durationchange loadeddata loadedmetadata', function (event) { + on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', function (event) { return controls.durationUpdate.call(_this3.player, event); }); // Check for audio tracks on load // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point - on(this.player.media, 'loadeddata canplay', function () { + on.call(this.player, this.player.media, 'loadeddata', function () { toggleHidden(_this3.player.elements.volume, !_this3.player.hasAudio); toggleHidden(_this3.player.elements.buttons.mute, !_this3.player.hasAudio); }); // Handle the media finishing - on(this.player.media, 'ended', function () { + on.call(this.player, this.player.media, 'ended', function () { // Show poster on end if (_this3.player.isHTML5 && _this3.player.isVideo && _this3.player.config.resetOnEnd) { // Restart @@ -9741,28 +9739,28 @@ var Listeners = function () { }); // Check for buffer progress - on(this.player.media, 'progress playing seeking seeked', function (event) { + on.call(this.player, this.player.media, 'progress playing seeking seeked', function (event) { return controls.updateProgress.call(_this3.player, event); }); // Handle volume changes - on(this.player.media, 'volumechange', function (event) { + on.call(this.player, this.player.media, 'volumechange', function (event) { return controls.updateVolume.call(_this3.player, event); }); // Handle play/pause - on(this.player.media, 'playing play pause ended emptied timeupdate', function (event) { + on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', function (event) { return ui.checkPlaying.call(_this3.player, event); }); // Loading state - on(this.player.media, 'waiting canplay seeked playing', function (event) { + on.call(this.player, this.player.media, 'waiting canplay seeked playing', function (event) { return ui.checkLoading.call(_this3.player, event); }); // If autoplay, then load advertisement if required // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows - on(this.player.media, 'playing', function () { + on.call(this.player, this.player.media, 'playing', function () { if (!_this3.player.ads) { return; } @@ -9789,7 +9787,7 @@ var Listeners = function () { } // On click play, pause ore restart - on(wrapper, 'click', function () { + on.call(this.player, wrapper, 'click', function () { // Touch devices will just show controls (if we're hiding controls) if (_this3.player.config.hideControls && _this3.player.touch && !_this3.player.paused) { return; @@ -9808,19 +9806,19 @@ var Listeners = function () { // Disable right click if (this.player.supported.ui && this.player.config.disableContextMenu) { - on(this.player.elements.wrapper, 'contextmenu', function (event) { + on.call(this.player, this.player.elements.wrapper, 'contextmenu', function (event) { event.preventDefault(); }, false); } // Volume change - on(this.player.media, 'volumechange', function () { + on.call(this.player, this.player.media, 'volumechange', function () { // Save to storage _this3.player.storage.set({ volume: _this3.player.volume, muted: _this3.player.muted }); }); // Speed change - on(this.player.media, 'ratechange', function () { + on.call(this.player, this.player.media, 'ratechange', function () { // Update UI controls.updateSetting.call(_this3.player, 'speed'); @@ -9829,19 +9827,19 @@ var Listeners = function () { }); // Quality request - on(this.player.media, 'qualityrequested', function (event) { + on.call(this.player, this.player.media, 'qualityrequested', function (event) { // Save to storage _this3.player.storage.set({ quality: event.detail.quality }); }); // Quality change - on(this.player.media, 'qualitychange', function (event) { + on.call(this.player, this.player.media, 'qualitychange', function (event) { // Update UI controls.updateSetting.call(_this3.player, 'quality', null, event.detail.quality); }); // Caption language change - on(this.player.media, 'languagechange', function () { + on.call(this.player, this.player.media, 'languagechange', function () { // Update UI controls.updateSetting.call(_this3.player, 'captions'); @@ -9850,7 +9848,7 @@ var Listeners = function () { }); // Captions toggle - on(this.player.media, 'captionsenabled captionsdisabled', function () { + on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', function () { // Update UI controls.updateSetting.call(_this3.player, 'captions'); @@ -9860,7 +9858,7 @@ var Listeners = function () { // Proxy events to container // Bubble up key events for Edge - on(this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { + on.call(this.player, this.player.media, this.player.config.events.concat(['keyup', 'keydown']).join(' '), function (event) { var _event$detail = event.detail, detail = _event$detail === undefined ? {} : _event$detail; @@ -9870,7 +9868,7 @@ var Listeners = function () { detail = _this3.player.media.error; } - trigger.call(_this3.player, _this3.player.elements.container, event.type, true, detail); + triggerEvent.call(_this3.player, _this3.player.elements.container, event.type, true, detail); }); } @@ -9882,7 +9880,7 @@ var Listeners = function () { var _this4 = this; // IE doesn't support input event, so we fallback to change - var inputEvent = browser$1.isIE ? 'change' : 'input'; + var inputEvent = browser.isIE ? 'change' : 'input'; // Run default and custom handlers var proxy = function proxy(event, defaultHandler, customHandlerKey) { @@ -9908,7 +9906,7 @@ var Listeners = function () { var customHandler = _this4.player.config.listeners[customHandlerKey]; var hasCustomHandler = is$1.function(customHandler); - on(element, type, function (event) { + on.call(_this4.player, element, type, function (event) { return proxy(event, defaultHandler, customHandlerKey); }, passive && !hasCustomHandler); }; @@ -10053,7 +10051,7 @@ var Listeners = function () { }, 'volume'); // Polyfill for lower fill in <input type="range"> for webkit - if (browser$1.isWebkit) { + if (browser.isWebkit) { bind(getElements.call(this.player, 'input[type="range"]'), 'input', function (event) { controls.updateRangeFill.call(_this4.player, event.target); }); @@ -10143,14 +10141,6 @@ var Listeners = function () { } }, 'volume', false); } - - // Reset on destroy - - }, { - key: 'clear', - value: function clear() { - this.global(false); - } }]); return Listeners; }(); @@ -10492,7 +10482,7 @@ function assurePlaybackState(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -10646,7 +10636,7 @@ var vimeo = { // Set seeking state and trigger event media.seeking = true; - trigger.call(player, media, 'seeking'); + triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete Promise.resolve(restorePause && embed.setVolume(0)) @@ -10676,7 +10666,7 @@ var vimeo = { set: function set(input) { player.embed.setPlaybackRate(input).then(function () { speed = input; - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }).catch(function (error) { // Hide menu item (and menu if empty) if (error.name === 'Error') { @@ -10696,7 +10686,7 @@ var vimeo = { set: function set(input) { player.embed.setVolume(input).then(function () { volume = input; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); } }); @@ -10713,7 +10703,7 @@ var vimeo = { player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () { muted = toggle; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); } }); @@ -10775,13 +10765,13 @@ var vimeo = { // Get current time player.embed.getCurrentTime().then(function (value) { currentTime = value; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); // Get duration player.embed.getDuration().then(function (value) { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); }); // Get captions @@ -10805,7 +10795,7 @@ var vimeo = { player.embed.getPaused().then(function (paused) { assurePlaybackState.call(player, !paused); if (!paused) { - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); } }); @@ -10820,7 +10810,7 @@ var vimeo = { player.embed.on('play', function () { assurePlaybackState.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); }); player.embed.on('pause', function () { @@ -10830,16 +10820,16 @@ var vimeo = { player.embed.on('timeupdate', function (data) { player.media.seeking = false; currentTime = data.seconds; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); player.embed.on('progress', function (data) { player.media.buffered = data.percent; - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); // Check all loaded if (parseInt(data.percent, 10) === 1) { - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } // Get duration as if we do it before load, it gives an incorrect value @@ -10847,24 +10837,24 @@ var vimeo = { player.embed.getDuration().then(function (value) { if (value !== player.media.duration) { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } }); }); player.embed.on('seeked', function () { player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); }); player.embed.on('ended', function () { player.media.paused = true; - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); }); player.embed.on('error', function (detail) { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }); // Rebuild UI @@ -10888,52 +10878,29 @@ function parseId$1(url) { // Standardise YouTube quality unit function mapQualityUnit(input) { - switch (input) { - case 'hd2160': - return 2160; - - case 2160: - return 'hd2160'; - - case 'hd1440': - return 1440; - - case 1440: - return 'hd1440'; - - case 'hd1080': - return 1080; - - case 1080: - return 'hd1080'; - - case 'hd720': - return 720; - - case 720: - return 'hd720'; - - case 'large': - return 480; - - case 480: - return 'large'; - - case 'medium': - return 360; - - case 360: - return 'medium'; - - case 'small': - return 240; + var qualities = { + hd2160: 2160, + hd1440: 1440, + hd1080: 1080, + hd720: 720, + large: 480, + medium: 360, + small: 240, + tiny: 144 + }; - case 240: - return 'small'; + var entry = Object.entries(qualities).find(function (entry) { + return entry.includes(input); + }); - default: - return 'default'; + if (entry) { + // Get the match corresponding to the input + return entry.find(function (value) { + return value !== input; + }); } + + return 'default'; } function mapQualityUnits(levels) { @@ -10953,7 +10920,7 @@ function assurePlaybackState$1(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -11141,10 +11108,10 @@ var youtube = { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }, onPlaybackQualityChange: function onPlaybackQualityChange() { - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: player.media.quality }); }, @@ -11155,7 +11122,7 @@ var youtube = { // Get current speed player.media.playbackRate = instance.getPlaybackRate(); - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }, onReady: function onReady(event) { // Get the instance @@ -11196,7 +11163,7 @@ var youtube = { // Set seeking state and trigger event player.media.seeking = true; - trigger.call(player, player.media, 'seeking'); + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent instance.seekTo(time); @@ -11219,15 +11186,7 @@ var youtube = { return mapQualityUnit(instance.getPlaybackQuality()); }, set: function set(input) { - var quality = input; - - // Set via API - instance.setPlaybackQuality(mapQualityUnit(quality)); - - // Trigger request event - trigger.call(player, player.media, 'qualityrequested', false, { - quality: quality - }); + instance.setPlaybackQuality(mapQualityUnit(input)); } }); @@ -11241,7 +11200,7 @@ var youtube = { set: function set(input) { volume = input; instance.setVolume(volume * 100); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); } }); @@ -11256,7 +11215,7 @@ var youtube = { var toggle = is$1.boolean(input) ? input : muted; muted = toggle; instance[toggle ? 'mute' : 'unMute'](); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); } }); @@ -11282,8 +11241,8 @@ var youtube = { player.media.setAttribute('tabindex', -1); } - trigger.call(player, player.media, 'timeupdate'); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer clearInterval(player.timers.buffering); @@ -11295,7 +11254,7 @@ var youtube = { // Trigger progress only when we actually buffer something if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); } // Set last buffer point @@ -11306,7 +11265,7 @@ var youtube = { clearInterval(player.timers.buffering); // Trigger event - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } }, 200); @@ -11327,7 +11286,7 @@ var youtube = { if (seeked) { // Unset seeking and fire seeked event player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); } // Handle events @@ -11340,11 +11299,11 @@ var youtube = { switch (event.data) { case -1: // Update scrubber - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube player.media.buffered = instance.getVideoLoadedFraction(); - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); break; @@ -11357,7 +11316,7 @@ var youtube = { instance.stopVideo(); instance.playVideo(); } else { - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); } break; @@ -11369,11 +11328,11 @@ var youtube = { } else { assurePlaybackState$1.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress player.timers.playing = setInterval(function () { - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }, 50); // Check duration again due to YouTube bug @@ -11381,7 +11340,7 @@ var youtube = { // https://code.google.com/p/gdata-issues/issues/detail?id=8690 if (player.media.duration !== instance.getDuration()) { player.media.duration = instance.getDuration(); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } // Get quality @@ -11403,7 +11362,7 @@ var youtube = { break; } - trigger.call(player, player.elements.container, 'statechange', false, { + triggerEvent.call(player, player.elements.container, 'statechange', false, { code: event.data }); } @@ -11760,7 +11719,7 @@ var Ads = function () { // Proxy event var dispatchEvent = function dispatchEvent(type) { var event = 'ads' + type.replace(/_/g, '').toLowerCase(); - trigger.call(_this7.player, _this7.player.media, event); + triggerEvent.call(_this7.player, _this7.player.media, event); }; switch (event.type) { @@ -12049,7 +12008,7 @@ var Ads = function () { }, { key: 'trigger', - value: function trigger$$1(event) { + value: function trigger(event) { var _this11 = this; for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { @@ -12436,7 +12395,7 @@ var Plyr = function () { this.elements.container.className = ''; // Get attributes from URL and set config - if (!url.searchParams) { + if (url.searchParams.length) { var truthy = ['1', 'true']; if (truthy.includes(url.searchParams.get('autoplay'))) { @@ -12511,6 +12470,8 @@ var Plyr = function () { return; } + this.eventListeners = []; + // Create listeners this.listeners = new Listeners(this); @@ -12537,7 +12498,7 @@ var Plyr = function () { // Listen for events if debugging if (this.config.debug) { - on(this.elements.container, this.config.events.join(' '), function (event) { + on.call(this, this.elements.container, this.config.events.join(' '), function (event) { _this.debug.log('event: ' + event.type); }); } @@ -12736,7 +12697,7 @@ var Plyr = function () { // Update state and trigger event if (active !== this.captions.active) { this.captions.active = active; - trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); + triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); } } @@ -12786,7 +12747,7 @@ var Plyr = function () { // Trigger event on change if (hiding !== isHidden) { var eventName = hiding ? 'controlshidden' : 'controlsshown'; - trigger.call(this, this.media, eventName); + triggerEvent.call(this, this.media, eventName); } return !hiding; } @@ -12802,9 +12763,19 @@ var Plyr = function () { }, { key: 'on', value: function on$$1(event, callback) { - on(this.elements.container, event, callback); + on.call(this, this.elements.container, event, callback); } + /** + * Add event listeners once + * @param {string} event - Event type + * @param {function} callback - Callback for when event occurs + */ + }, { + key: 'once', + value: function once$$1(event, callback) { + once(this.elements.container, event, callback); + } /** * Remove event listeners * @param {string} event - Event type @@ -12865,13 +12836,13 @@ var Plyr = function () { } } else { // Unbind listeners - _this2.listeners.clear(); + unbindListeners.call(_this2); // Replace the container with the original element provided replaceElement(_this2.elements.original, _this2.elements.container); // Event - trigger.call(_this2, _this2.elements.original, 'destroyed', true); + triggerEvent.call(_this2, _this2.elements.original, 'destroyed', true); // Callback if (is$1.function(callback)) { @@ -13263,36 +13234,26 @@ var Plyr = function () { }, { key: 'quality', set: function set(input) { - var quality = null; + var config = this.config.quality; + var options = this.options.quality; - if (!is$1.empty(input)) { - quality = Number(input); - } - - if (!is$1.number(quality)) { - quality = this.storage.get('quality'); - } - - if (!is$1.number(quality)) { - quality = this.config.quality.selected; - } - - if (!is$1.number(quality)) { - quality = this.config.quality.default; - } - - if (!this.options.quality.length) { + if (!options.length) { return; } - if (!this.options.quality.includes(quality)) { - var value = closest(this.options.quality, quality); + var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number); + + if (!options.includes(quality)) { + var value = closest(options, quality); this.debug.warn('Unsupported quality option: ' + quality + ', using ' + value + ' instead'); quality = value; } + // Trigger request event + triggerEvent.call(this, this.media, 'qualityrequested', false, { quality: quality }); + // Update config - this.config.quality.selected = quality; + config.selected = quality; // Set quality this.media.quality = quality; @@ -13521,8 +13482,8 @@ var Plyr = function () { }, { key: 'loadSprite', - value: function loadSprite(url, id) { - return loadScript(url, id); + value: function loadSprite$$1(url, id) { + return loadSprite(url, id); } /** diff --git a/dist/plyr.polyfilled.js.map b/dist/plyr.polyfilled.js.map index ecb1ba79..968b102c 100644 --- a/dist/plyr.polyfilled.js.map +++ b/dist/plyr.polyfilled.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_library.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","utils/arrays.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js","plyr.polyfilled.js"],"names":["isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","global","aFunction","core","ctx","redefine","uid","toInteger","toLength","cof","IObject","defined","min","toIObject","toAbsoluteIndex","$keys","toObject","DESCRIPTORS","toIndex","$typed","anInstance","arrayFill","redefineAll","fails","LIBRARY","setToStringTag","SPECIES","buffer","VIEW","$export","speciesConstructor","TAG","Iterators","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","ITERATOR","classof","isArray","asc","ArrayProto","create","descriptor","$iterCreate","getPrototypeOf","step","addToUnscopables","pIE","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","getIterFn","isArrayIter","call","forOf","validate","$iterDefine","setSpecies","meta","$iterDetect","inheritIfRequired","strong","gOPS","createArrayMethod","id","$has","weak","assign","invoke","bind","gOPD","getProto","Reflect","gOPN","setProto","cel","html","process","Promise","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","perform","promiseResolve","wksExt","toString","$GOPD","$DP","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","wksDefine","$getOwnPropertyDescriptor","$getPrototypeOf","isRegExp","MATCH","context","$defineProperty","createProperty","$find","KEY","forced","floor","isInteger","log1p","sign","$expm1","abs","exp","expm1","isEnum","ownKeys","repeat","navigator","userAgent","$pad","wrap","$task","i","NAME","$iterators","this","CustomEvent","getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","passive","capture","empty","function","from","forEach","element","Node","events","split","type","on","off","trigger","bubbles","detail","dispatchEvent","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","key","value","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","toggleState","pressed","getAttribute","state","transitionEndEvent","find","style","undefined","repaint","offsetHeight","browser","documentMode","documentElement","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","range","matchMedia","dedupe","filter","item","indexOf","closest","reduce","prev","curr","Math","html5","sources","getSources","sizes","source","map","player","mime","currentTime","playing","src","onLoadedMetaData","load","play","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","obj","extend","shift","generateId","prefix","random","format","args","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","storage","store","localStorage","getItem","json","get","setItem","removeItem","loadSprite","url","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","push","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","props","findElements","labels","join","fetch","responseType","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","changed","caption","defaults","providers","types","getProviderByUrl","youtube","vimeo","noop","Console","console","onChange","isIos","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","define","loadScript","parseId","regex","$2","getAspectRatio","getRatio","w","h","ratio","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","urls","sdk","padding","paddingBottom","offset","transform","autoplay","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","build","mapQualityUnit","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","apply","Date","now","base","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","clear","unload","inputIsValid","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","change","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","module.exports = false;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\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\ntry {\n var ce = new window.CustomEvent('test');\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 bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\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\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\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 */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\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 */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\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 */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, false, passive, capture);\n}\n\n// Trigger event\nexport function trigger(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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default { browser };\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport { removeElement } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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());\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (is.array(options)) {\n this.options.quality = 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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.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(container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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(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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n trigger.call(this, this.media, 'languagechange');\n }\n\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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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 trigger.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n on(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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 trigger.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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, toggleListener, trigger } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on(this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on(this.player.media, 'loadeddata canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n trigger.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n trigger.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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n trigger.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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 trigger.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n trigger.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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n trigger.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n trigger.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n trigger.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n trigger.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n trigger.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 trigger.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n trigger.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n trigger.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n trigger.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n trigger.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n trigger.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n trigger.call(player, player.media, 'timeupdate');\n trigger.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n trigger.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n trigger.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n trigger.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n trigger.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n trigger.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n trigger.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n trigger.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n trigger.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n trigger.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n trigger.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, trigger } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadScript';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (!url.searchParams) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!is.empty(input)) {\n quality = Number(input);\n }\n\n if (!is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const value = closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n trigger.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n trigger.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'babel-polyfill';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]}
\ No newline at end of file +{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_library.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","utils/arrays.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js","plyr.polyfilled.js"],"names":["isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","global","aFunction","core","ctx","redefine","uid","toInteger","toLength","cof","IObject","defined","min","toIObject","toAbsoluteIndex","$keys","toObject","DESCRIPTORS","toIndex","$typed","anInstance","arrayFill","redefineAll","fails","LIBRARY","setToStringTag","SPECIES","buffer","VIEW","$export","speciesConstructor","TAG","Iterators","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","ITERATOR","classof","isArray","asc","ArrayProto","create","descriptor","$iterCreate","getPrototypeOf","step","addToUnscopables","pIE","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","require$$22","require$$23","require$$24","require$$25","require$$26","require$$27","require$$28","require$$29","require$$30","require$$31","require$$32","require$$33","require$$34","require$$35","require$$36","require$$37","require$$38","getIterFn","isArrayIter","call","forOf","validate","$iterDefine","setSpecies","meta","$iterDetect","inheritIfRequired","strong","gOPS","createArrayMethod","id","$has","weak","assign","invoke","bind","gOPD","getProto","Reflect","gOPN","setProto","cel","html","process","Promise","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","perform","promiseResolve","wksExt","toString","$GOPD","$DP","gOPNExt","wks","shared","ObjectProto","USE_NATIVE","$fails","_create","enumKeys","wksDefine","$getOwnPropertyDescriptor","$getPrototypeOf","isRegExp","MATCH","context","$defineProperty","createProperty","$find","KEY","forced","floor","isInteger","log1p","sign","$expm1","abs","exp","expm1","isEnum","ownKeys","repeat","navigator","userAgent","$pad","wrap","$task","i","NAME","$iterators","this","CustomEvent","getConstructor","input","constructor","instanceOf","Boolean","is","Object","Number","isNaN","String","Function","nullOrUndefined","Array","WeakMap","NodeList","Element","Text","Event","window","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","supportsPassiveListeners","supported","options","defineProperty","addEventListener","removeEventListener","e","toggleListener","elements","event","callback","toggle","passive","capture","once","empty","function","from","forEach","element","Node","events","split","eventListeners","push","type","on","off","onceCallback","args","apply","triggerEvent","bubbles","detail","dispatchEvent","unbindListeners","item","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","key","value","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","boolean","hasAttribute","removeAttribute","toggleClass","force","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","body","trapFocus","focusable","first","last","trap","keyCode","shiftKey","focus","preventDefault","toggleState","pressed","getAttribute","state","transitionEndEvent","find","style","undefined","repaint","offsetHeight","browser","documentMode","documentElement","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","range","matchMedia","html5","sources","filter","mime","source","getSources","map","player","currentTime","playing","src","onLoadedMetaData","load","play","config","blankVideo","debug","log","cloneDeep","JSON","parse","stringify","getDeep","path","reduce","obj","extend","shift","generateId","prefix","Math","random","format","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","dedupe","indexOf","closest","prev","curr","Storage","enabled","storage","store","localStorage","getItem","json","get","setItem","removeItem","loadSprite","url","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","number","hours","mins","secs","controls","URL","iconUrl","location","cors","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","duration","seekTooltip","classNames","tooltip","error","warn","toggleNativeControls","namespace","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","updateRangeFill","suffix","list","checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","setProgress","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","touch","width","pageX","left","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","toggleTab","checkMenu","getBadge","createBadge","sort","a","b","sorting","createMenuItem","getLabel","updateSetting","pane","currentTrack","default","tracks","getTracks","track","active","language","unshift","speed","isVimeo","values","some","tab","form","show","isMenuItem","isButton","stopPropagation","open","clone","position","opacity","name","scrollWidth","height","scrollHeight","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","props","findElements","labels","join","fetch","responseType","resolve","reject","request","XMLHttpRequest","responseText","response","Error","statusText","send","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","set","isYouTube","textTracks","setCaptionsMenu","hostname","protocol","createObjectURL","blob","userLanguage","setLanguage","trackEvents","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","toggleCaptions","getCurrentTrack","embed","enableTextTrack","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","changed","caption","defaults","providers","types","getProviderByUrl","youtube","vimeo","noop","Console","console","onChange","isIos","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","iframe","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","setTimeout","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showHomeTab","showTab","currentTarget","eventType","done","seekTo","toggleInvert","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","define","loadScript","parseId","regex","$2","getAspectRatio","getRatio","w","h","ratio","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","urls","sdk","padding","paddingBottom","offset","transform","autoplay","embedContainer","thumbnail_large","pathname","Player","autopause","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","all","getVideoWidth","getVideoHeight","dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","build","mapQualityUnit","qualities","entry","mapQualityUnits","levels","level","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","items","snippet","currentId","startsWith","posterSrc","backgroundSize","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","setInterval","getVideoLoadedFraction","lastBuffered","seeked","getAvailableQualityLevels","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","Date","now","base","attribute","cancelRequests","check","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","original","tagName","searchParams","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","end","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","change","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","module.exports = false;\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\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\ntry {\n var ce = new window.CustomEvent('test');\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 bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\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\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\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 */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\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 */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\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 */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 && !once) {\n // Cache event listener\n this.eventListeners.push({ elements, type, callback, options });\n }\n\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport 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\nexport 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\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener(element, events, onceCallback, true, passive, capture, true);\n}\n\n// Trigger event\nexport 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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { elements, type, callback, options } = item;\n elements.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\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.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { once } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n };\n\n // Listen for the transition finishing and restore auto height/width\n once(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\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 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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\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 onChange.call(this);\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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'loadeddata', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on.call(this.player, this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on.call(this.player, this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(this.player, element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = 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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\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\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\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\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 setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n triggerEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = ([\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ]).find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once(this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n","// ==========================================================================\n// Plyr Polyfilled Build\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport 'babel-polyfill';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\nimport Plyr from './plyr';\n\nexport default Plyr;\n"]}
\ No newline at end of file diff --git a/dist/plyr.polyfilled.min.js b/dist/plyr.polyfilled.min.js index b3328895..78792a29 100644 --- a/dist/plyr.polyfilled.min.js +++ b/dist/plyr.polyfilled.min.js @@ -1,2 +1,2 @@ -"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=t(function(e){var t=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=t)}),r=(i.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),o=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e},a=function(e){try{return!!e()}catch(e){return!0}},s=!a(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),l=n.document,c=r(l)&&r(l.createElement),u=function(e){return c?l.createElement(e):{}},f=!s&&!a(function(){return 7!=Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a}),h=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,p={f:s?Object.defineProperty:function(e,t,n){if(o(e),t=h(t,!0),o(n),f)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},g=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},m=s?function(e,t,n){return p.f(e,t,g(1,n))}:function(e,t,n){return e[t]=n,e},y={}.hasOwnProperty,v=function(e,t){return y.call(e,t)},b=0,w=Math.random(),k=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},T=t(function(e){var t=k("src"),r=Function.toString,o=(""+r).split("toString");i.inspectSource=function(e){return r.call(e)},(e.exports=function(e,i,r,a){var s="function"==typeof r;s&&(v(r,"name")||m(r,"name",i)),e[i]!==r&&(s&&(v(r,t)||m(r,t,e[i]?""+e[i]:o.join(String(i)))),e===n?e[i]=r:a?e[i]?e[i]=r:m(e,i,r):(delete e[i],m(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||r.call(this)})}),S=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(e,t,n){if(S(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},_=function(e,t,r){var o,a,s,l,c=e&_.F,u=e&_.G,f=e&_.S,h=e&_.P,d=e&_.B,p=u?n:f?n[t]||(n[t]={}):(n[t]||{}).prototype,g=u?i:i[t]||(i[t]={}),y=g.prototype||(g.prototype={});for(o in u&&(r=t),r)s=((a=!c&&p&&void 0!==p[o])?p:r)[o],l=d&&a?E(s,n):h&&"function"==typeof s?E(Function.call,s):s,p&&T(p,o,s,e&_.U),g[o]!=s&&m(g,o,l),h&&y[o]!=s&&(y[o]=s)};n.core=i,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;for(var A,P=_,M=k("typed_array"),L=k("view"),C=!(!n.ArrayBuffer||!n.DataView),x=C,O=0,N="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");O<9;)(A=n[N[O++]])?(m(A.prototype,M,!0),m(A.prototype,L,!0)):x=!1;var j={ABV:C,CONSTR:x,TYPED:M,VIEW:L},I=function(e,t,n){for(var i in t)T(e,i,t[i],n);return e},F=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},R=Math.ceil,q=Math.floor,V=function(e){return isNaN(e=+e)?0:(e>0?q:R)(e)},D=Math.min,B=function(e){return e>0?D(V(e),9007199254740991):0},U=function(e){if(void 0===e)return 0;var t=V(e),n=B(t);if(t!==n)throw RangeError("Wrong length!");return n},H={}.toString,W=function(e){return H.call(e).slice(8,-1)},z=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==W(e)?e.split(""):Object(e)},G=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},K=function(e){return z(G(e))},Y=Math.max,Q=Math.min,J=function(e,t){return(e=V(e))<0?Y(e+t,0):Q(e,t)},$=function(e){return function(t,n,i){var r,o=K(t),a=B(o.length),s=J(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},X=n["__core-js_shared__"]||(n["__core-js_shared__"]={}),Z=function(e){return X[e]||(X[e]={})},ee=Z("keys"),te=function(e){return ee[e]||(ee[e]=k(e))},ne=$(!1),ie=te("IE_PROTO"),re=function(e,t){var n,i=K(e),r=0,o=[];for(n in i)n!=ie&&v(i,n)&&o.push(n);for(;t.length>r;)v(i,n=t[r++])&&(~ne(o,n)||o.push(n));return o},oe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),ae=oe.concat("length","prototype"),se={f:Object.getOwnPropertyNames||function(e){return re(e,ae)}},le=function(e){return Object(G(e))},ce=function(e){for(var t=le(this),n=B(t.length),i=arguments.length,r=J(i>1?arguments[1]:void 0,n),o=i>2?arguments[2]:void 0,a=void 0===o?n:J(o,n);a>r;)t[r++]=e;return t},ue=t(function(e){var t=Z("wks"),i=n.Symbol,r="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=r&&i[e]||(r?i:k)("Symbol."+e))}).store=t}),fe=p.f,he=ue("toStringTag"),de=function(e,t,n){e&&!v(e=n?e:e.prototype,he)&&fe(e,he,{configurable:!0,value:t})},pe=t(function(e,t){var i=se.f,r=p.f,o="prototype",l="Wrong index!",c=n.ArrayBuffer,u=n.DataView,f=n.Math,h=n.RangeError,d=n.Infinity,g=c,y=f.abs,v=f.pow,b=f.floor,w=f.log,k=f.LN2,T=s?"_b":"buffer",S=s?"_l":"byteLength",E=s?"_o":"byteOffset";function _(e,t,n){var i,r,o,a=new Array(n),s=8*n-t-1,l=(1<<s)-1,c=l>>1,u=23===t?v(2,-24)-v(2,-77):0,f=0,h=e<0||0===e&&1/e<0?1:0;for((e=y(e))!=e||e===d?(r=e!=e?1:0,i=l):(i=b(w(e)/k),e*(o=v(2,-i))<1&&(i--,o*=2),(e+=i+c>=1?u/o:u*v(2,1-c))*o>=2&&(i++,o/=2),i+c>=l?(r=0,i=l):i+c>=1?(r=(e*o-1)*v(2,t),i+=c):(r=e*v(2,c-1)*v(2,t),i=0));t>=8;a[f++]=255&r,r/=256,t-=8);for(i=i<<t|r,s+=t;s>0;a[f++]=255&i,i/=256,s-=8);return a[--f]|=128*h,a}function A(e,t,n){var i,r=8*n-t-1,o=(1<<r)-1,a=o>>1,s=r-7,l=n-1,c=e[l--],u=127&c;for(c>>=7;s>0;u=256*u+e[l],l--,s-=8);for(i=u&(1<<-s)-1,u>>=-s,s+=t;s>0;i=256*i+e[l],l--,s-=8);if(0===u)u=1-a;else{if(u===o)return i?NaN:c?-d:d;i+=v(2,t),u-=a}return(c?-1:1)*i*v(2,u-t)}function P(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function M(e){return[255&e]}function L(e){return[255&e,e>>8&255]}function C(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function x(e){return _(e,52,8)}function O(e){return _(e,23,4)}function N(e,t,n){r(e[o],t,{get:function(){return this[n]}})}function R(e,t,n,i){var r=U(+n);if(r+t>e[S])throw h(l);var o=e[T]._b,a=r+e[E],s=o.slice(a,a+t);return i?s:s.reverse()}function q(e,t,n,i,r,o){var a=U(+n);if(a+t>e[S])throw h(l);for(var s=e[T]._b,c=a+e[E],u=i(+r),f=0;f<t;f++)s[c+f]=u[o?f:t-f-1]}if(j.ABV){if(!a(function(){c(1)})||!a(function(){new c(-1)})||a(function(){return new c,new c(1.5),new c(NaN),"ArrayBuffer"!=c.name})){for(var D,H=(c=function(e){return F(this,c),new g(U(e))})[o]=g[o],W=i(g),z=0;W.length>z;)(D=W[z++])in c||m(c,D,g[D]);H.constructor=c}var G=new u(new c(2)),K=u[o].setInt8;G.setInt8(0,2147483648),G.setInt8(1,2147483649),!G.getInt8(0)&&G.getInt8(1)||I(u[o],{setInt8:function(e,t){K.call(this,e,t<<24>>24)},setUint8:function(e,t){K.call(this,e,t<<24>>24)}},!0)}else c=function(e){F(this,c,"ArrayBuffer");var t=U(e);this._b=ce.call(new Array(t),0),this[S]=t},u=function(e,t,n){F(this,u,"DataView"),F(e,c,"DataView");var i=e[S],r=V(t);if(r<0||r>i)throw h("Wrong offset!");if(r+(n=void 0===n?i-r:B(n))>i)throw h("Wrong length!");this[T]=e,this[E]=r,this[S]=n},s&&(N(c,"byteLength","_l"),N(u,"buffer","_b"),N(u,"byteLength","_l"),N(u,"byteOffset","_o")),I(u[o],{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return P(R(this,4,e,arguments[1]))},getUint32:function(e){return P(R(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return A(R(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return A(R(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,M,t)},setUint8:function(e,t){q(this,1,e,M,t)},setInt16:function(e,t){q(this,2,e,L,t,arguments[2])},setUint16:function(e,t){q(this,2,e,L,t,arguments[2])},setInt32:function(e,t){q(this,4,e,C,t,arguments[2])},setUint32:function(e,t){q(this,4,e,C,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,O,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,x,t,arguments[2])}});de(c,"ArrayBuffer"),de(u,"DataView"),m(u[o],j.VIEW,!0),t.ArrayBuffer=c,t.DataView=u}),ge=ue("species"),me=function(e,t){var n,i=o(e).constructor;return void 0===i||null==(n=o(i)[ge])?t:S(n)},ye=ue("species"),ve=function(e){var t=n[e];s&&t&&!t[ye]&&p.f(t,ye,{configurable:!0,get:function(){return this}})},be=n.ArrayBuffer,we=pe.ArrayBuffer,ke=pe.DataView,Te=j.ABV&&be.isView,Se=we.prototype.slice,Ee=j.VIEW;P(P.G+P.W+P.F*(be!==we),{ArrayBuffer:we}),P(P.S+P.F*!j.CONSTR,"ArrayBuffer",{isView:function(e){return Te&&Te(e)||r(e)&&Ee in e}}),P(P.P+P.U+P.F*a(function(){return!new we(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==Se&&void 0===t)return Se.call(o(this),e);for(var n=o(this).byteLength,i=J(e,n),r=J(void 0===t?n:t,n),a=new(me(this,we))(B(r-i)),s=new ke(this),l=new ke(a),c=0;i<r;)l.setUint8(c++,s.getUint8(i++));return a}}),ve("ArrayBuffer");var _e=ue("toStringTag"),Ae="Arguments"==W(function(){return arguments}()),Pe=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),_e))?n:Ae?W(t):"Object"==(i=W(t))&&"function"==typeof t.callee?"Arguments":i},Me={},Le=ue("iterator"),Ce=Array.prototype,xe=function(e){return void 0!==e&&(Me.Array===e||Ce[Le]===e)},Oe=Object.keys||function(e){return re(e,oe)},Ne=s?Object.defineProperties:function(e,t){o(e);for(var n,i=Oe(t),r=i.length,a=0;r>a;)p.f(e,n=i[a++],t[n]);return e},je=n.document,Ie=je&&je.documentElement,Fe=te("IE_PROTO"),Re=function(){},qe=function(){var e,t=u("iframe"),n=oe.length;for(t.style.display="none",Ie.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),qe=e.F;n--;)delete qe.prototype[oe[n]];return qe()},Ve=Object.create||function(e,t){var n;return null!==e?(Re.prototype=o(e),n=new Re,Re.prototype=null,n[Fe]=e):n=qe(),void 0===t?n:Ne(n,t)},De=te("IE_PROTO"),Be=Object.prototype,Ue=Object.getPrototypeOf||function(e){return e=le(e),v(e,De)?e[De]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Be:null},He=ue("iterator"),We=i.getIteratorMethod=function(e){if(null!=e)return e[He]||e["@@iterator"]||Me[Pe(e)]},ze=Array.isArray||function(e){return"Array"==W(e)},Ge=ue("species"),Ke=function(e,t){return new(function(e){var t;return ze(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!ze(t.prototype)||(t=void 0),r(t)&&null===(t=t[Ge])&&(t=void 0)),void 0===t?Array:t}(e))(t)},Ye=function(e,t){var n=1==e,i=2==e,r=3==e,o=4==e,a=6==e,s=5==e||a,l=t||Ke;return function(t,c,u){for(var f,h,d=le(t),p=z(d),g=E(c,u,3),m=B(p.length),y=0,v=n?l(t,m):i?l(t,0):void 0;m>y;y++)if((s||y in p)&&(h=g(f=p[y],y,d),e))if(n)v[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:v.push(f)}else if(o)return!1;return a?-1:r||o?o:v}},Qe=ue("unscopables"),Je=Array.prototype;null==Je[Qe]&&m(Je,Qe,{});var $e=function(e){Je[Qe][e]=!0},Xe=function(e,t){return{value:t,done:!!e}},Ze={};m(Ze,ue("iterator"),function(){return this});var et=function(e,t,n){e.prototype=Ve(Ze,{next:g(1,n)}),de(e,t+" Iterator")},tt=ue("iterator"),nt=!([].keys&&"next"in[].keys()),it=function(){return this},rt=function(e,t,n,i,r,o,a){et(n,t,i);var s,l,c,u=function(e){if(!nt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",h="values"==r,d=!1,p=e.prototype,g=p[tt]||p["@@iterator"]||r&&p[r],y=!nt&&g||u(r),b=r?h?u("entries"):y:void 0,w="Array"==t&&p.entries||g;if(w&&(c=Ue(w.call(new e)))!==Object.prototype&&c.next&&(de(c,f,!0),v(c,tt)||m(c,tt,it)),h&&g&&"values"!==g.name&&(d=!0,y=function(){return g.call(this)}),(nt||d||!p[tt])&&m(p,tt,y),Me[t]=y,Me[f]=it,r)if(s={values:h?y:u("values"),keys:o?y:u("keys"),entries:b},a)for(l in s)l in p||T(p,l,s[l]);else P(P.P+P.F*(nt||d),t,s);return s},ot=rt(Array,"Array",function(e,t){this._t=K(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Xe(1)):Xe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Me.Arguments=Me.Array,$e("keys"),$e("values"),$e("entries");var at=ue("iterator"),st=!1;try{[7][at]().return=function(){st=!0}}catch(e){}var lt=function(e,t){if(!t&&!st)return!1;var n=!1;try{var i=[7],r=i[at]();r.next=function(){return{done:n=!0}},i[at]=function(){return r},e(i)}catch(e){}return n},ct=[].copyWithin||function(e,t){var n=le(this),i=B(n.length),r=J(e,i),o=J(t,i),a=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===a?i:J(a,i))-o,i-r),l=1;for(o<r&&r<o+s&&(l=-1,o+=s-1,r+=s-1);s-- >0;)o in n?n[r]=n[o]:delete n[r],r+=l,o+=l;return n},ut={f:{}.propertyIsEnumerable},ft=Object.getOwnPropertyDescriptor,ht={f:s?ft:function(e,t){if(e=K(e),t=h(t,!0),f)try{return ft(e,t)}catch(e){}if(v(e,t))return g(!ut.f.call(e,t),e[t])}},dt=t(function(e){if(s){var t=n,i=a,o=P,l=j,c=pe,u=E,f=F,d=g,y=m,b=I,w=V,T=B,S=U,_=J,A=h,M=v,L=Pe,C=r,x=le,O=xe,N=Ve,R=Ue,q=se.f,D=We,H=k,W=ue,z=Ye,G=$,K=me,Y=ot,Q=Me,X=lt,Z=ve,ee=ce,te=ct,ne=p,ie=ht,re=ne.f,oe=ie.f,ae=t.RangeError,fe=t.TypeError,he=t.Uint8Array,de=Array.prototype,ge=c.ArrayBuffer,ye=c.DataView,be=z(0),we=z(2),ke=z(3),Te=z(4),Se=z(5),Ee=z(6),_e=G(!0),Ae=G(!1),Le=Y.values,Ce=Y.keys,Oe=Y.entries,Ne=de.lastIndexOf,je=de.reduce,Ie=de.reduceRight,Fe=de.join,Re=de.sort,qe=de.slice,De=de.toString,Be=de.toLocaleString,He=W("iterator"),ze=W("toStringTag"),Ge=H("typed_constructor"),Ke=H("def_constructor"),Qe=l.CONSTR,Je=l.TYPED,$e=l.VIEW,Xe=z(1,function(e,t){return it(K(e,e[Ke]),t)}),Ze=i(function(){return 1===new he(new Uint16Array([1]).buffer)[0]}),et=!!he&&!!he.prototype.set&&i(function(){new he(1).set({})}),tt=function(e,t){var n=w(e);if(n<0||n%t)throw ae("Wrong offset!");return n},nt=function(e){if(C(e)&&Je in e)return e;throw fe(e+" is not a typed array!")},it=function(e,t){if(!(C(e)&&Ge in e))throw fe("It is not a typed array constructor!");return new e(t)},rt=function(e,t){return at(K(e,e[Ke]),t)},at=function(e,t){for(var n=0,i=t.length,r=it(e,i);i>n;)r[n]=t[n++];return r},st=function(e,t,n){re(e,t,{get:function(){return this._d[n]}})},ut=function(e){var t,n,i,r,o,a,s=x(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,h=D(s);if(null!=h&&!O(h)){for(a=h.call(s),i=[],t=0;!(o=a.next()).done;t++)i.push(o.value);s=i}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=T(s.length),r=it(this,n);n>t;t++)r[t]=f?c(s[t],t):s[t];return r},ft=function(){for(var e=0,t=arguments.length,n=it(this,t);t>e;)n[e]=arguments[e++];return n},dt=!!he&&i(function(){Be.call(new he(1))}),pt=function(){return Be.apply(dt?qe.call(nt(this)):nt(this),arguments)},gt={copyWithin:function(e,t){return te.call(nt(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Te(nt(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return ee.apply(nt(this),arguments)},filter:function(e){return rt(this,we(nt(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Se(nt(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return Ee(nt(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){be(nt(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return Ae(nt(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return _e(nt(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return Fe.apply(nt(this),arguments)},lastIndexOf:function(e){return Ne.apply(nt(this),arguments)},map:function(e){return Xe(nt(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return je.apply(nt(this),arguments)},reduceRight:function(e){return Ie.apply(nt(this),arguments)},reverse:function(){for(var e,t=nt(this).length,n=Math.floor(t/2),i=0;i<n;)e=this[i],this[i++]=this[--t],this[t]=e;return this},some:function(e){return ke(nt(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return Re.call(nt(this),e)},subarray:function(e,t){var n=nt(this),i=n.length,r=_(e,i);return new(K(n,n[Ke]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,T((void 0===t?i:_(t,i))-r))}},mt=function(e,t){return rt(this,qe.call(nt(this),e,t))},yt=function(e){nt(this);var t=tt(arguments[1],1),n=this.length,i=x(e),r=T(i.length),o=0;if(r+t>n)throw ae("Wrong length!");for(;o<r;)this[t+o]=i[o++]},vt={entries:function(){return Oe.call(nt(this))},keys:function(){return Ce.call(nt(this))},values:function(){return Le.call(nt(this))}},bt=function(e,t){return C(e)&&e[Je]&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},wt=function(e,t){return bt(e,t=A(t,!0))?d(2,e[t]):oe(e,t)},kt=function(e,t,n){return!(bt(e,t=A(t,!0))&&C(n)&&M(n,"value"))||M(n,"get")||M(n,"set")||n.configurable||M(n,"writable")&&!n.writable||M(n,"enumerable")&&!n.enumerable?re(e,t,n):(e[t]=n.value,e)};Qe||(ie.f=wt,ne.f=kt),o(o.S+o.F*!Qe,"Object",{getOwnPropertyDescriptor:wt,defineProperty:kt}),i(function(){De.call({})})&&(De=Be=function(){return Fe.call(this)});var Tt=b({},gt);b(Tt,vt),y(Tt,He,vt.values),b(Tt,{slice:mt,set:yt,constructor:function(){},toString:De,toLocaleString:pt}),st(Tt,"buffer","b"),st(Tt,"byteOffset","o"),st(Tt,"byteLength","l"),st(Tt,"length","e"),re(Tt,ze,{get:function(){return this[Je]}}),e.exports=function(e,n,r,a){var s=e+((a=!!a)?"Clamped":"")+"Array",c="get"+e,u="set"+e,h=t[s],d=h||{},p=h&&R(h),g=!h||!l.ABV,m={},v=h&&h.prototype,b=function(e,t){re(e,t,{get:function(){return function(e,t){var i=e._d;return i.v[c](t*n+i.o,Ze)}(this,t)},set:function(e){return function(e,t,i){var r=e._d;a&&(i=(i=Math.round(i))<0?0:i>255?255:255&i),r.v[u](t*n+r.o,i,Ze)}(this,t,e)},enumerable:!0})};g?(h=r(function(e,t,i,r){f(e,h,s,"_d");var o,a,l,c,u=0,d=0;if(C(t)){if(!(t instanceof ge||"ArrayBuffer"==(c=L(t))||"SharedArrayBuffer"==c))return Je in t?at(h,t):ut.call(h,t);o=t,d=tt(i,n);var p=t.byteLength;if(void 0===r){if(p%n)throw ae("Wrong length!");if((a=p-d)<0)throw ae("Wrong length!")}else if((a=T(r)*n)+d>p)throw ae("Wrong length!");l=a/n}else l=S(t),o=new ge(a=l*n);for(y(e,"_d",{b:o,o:d,l:a,e:l,v:new ye(o)});u<l;)b(e,u++)}),v=h.prototype=N(Tt),y(v,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&X(function(e){new h,new h(null),new h(1.5),new h(e)},!0)||(h=r(function(e,t,i,r){var o;return f(e,h,s),C(t)?t instanceof ge||"ArrayBuffer"==(o=L(t))||"SharedArrayBuffer"==o?void 0!==r?new d(t,tt(i,n),r):void 0!==i?new d(t,tt(i,n)):new d(t):Je in t?at(h,t):ut.call(h,t):new d(S(t))}),be(p!==Function.prototype?q(d).concat(q(p)):q(d),function(e){e in h||y(h,e,d[e])}),h.prototype=v,v.constructor=h);var w=v[He],k=!!w&&("values"==w.name||null==w.name),E=vt.values;y(h,Ge,!0),y(v,Je,s),y(v,$e,!0),y(v,Ke,h),(a?new h(1)[ze]==s:ze in v)||re(v,ze,{get:function(){return s}}),m[s]=h,o(o.G+o.W+o.F*(h!=d),m),o(o.S,s,{BYTES_PER_ELEMENT:n}),o(o.S+o.F*i(function(){d.of.call(h,1)}),s,{from:ut,of:ft}),"BYTES_PER_ELEMENT"in v||y(v,"BYTES_PER_ELEMENT",n),o(o.P,s,gt),Z(s),o(o.P+o.F*et,s,{set:yt}),o(o.P+o.F*!k,s,vt),v.toString!=De&&(v.toString=De),o(o.P+o.F*i(function(){new h(1).slice()}),s,{slice:mt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){v.toLocaleString.call([1,2])})),s,{toLocaleString:pt}),Q[s]=k?w:E,k||y(v,He,E)}}else e.exports=function(){}});dt("Int8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}},!0),dt("Int16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Int32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float64",8,function(e){return function(t,n,i){return e(this,t,n,i)}});var pt=function(e,t,n,i){try{return i?t(o(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&o(r.call(e)),t}},gt=t(function(e){var t={},n={},i=e.exports=function(e,i,r,a,s){var l,c,u,f,h=s?function(){return e}:We(e),d=E(r,a,i?2:1),p=0;if("function"!=typeof h)throw TypeError(e+" is not iterable!");if(xe(h)){for(l=B(e.length);l>p;p++)if((f=i?d(o(c=e[p])[0],c[1]):d(e[p]))===t||f===n)return f}else for(u=h.call(e);!(c=u.next()).done;)if((f=pt(u,d,c.value,i))===t||f===n)return f};i.BREAK=t,i.RETURN=n}),mt=t(function(e){var t=k("meta"),n=p.f,i=0,o=Object.isExtensible||function(){return!0},s=!a(function(){return o(Object.preventExtensions({}))}),l=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!v(e,t)){if(!o(e))return"F";if(!n)return"E";l(e)}return e[t].i},getWeak:function(e,n){if(!v(e,t)){if(!o(e))return!0;if(!n)return!1;l(e)}return e[t].w},onFreeze:function(e){return s&&c.NEED&&o(e)&&!v(e,t)&&l(e),e}}}),yt=(mt.KEY,mt.NEED,mt.fastKey,mt.getWeak,mt.onFreeze,function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}),vt=p.f,bt=mt.fastKey,wt=s?"_s":"size",kt=function(e,t){var n,i=bt(t);if("F"!==i)return e._i[i];for(n=e._f;n;n=n.n)if(n.k==t)return n},Tt={getConstructor:function(e,t,n,i){var r=e(function(e,o){F(e,r,t,"_i"),e._t=t,e._i=Ve(null),e._f=void 0,e._l=void 0,e[wt]=0,null!=o&>(o,n,e[i],e)});return I(r.prototype,{clear:function(){for(var e=yt(this,t),n=e._i,i=e._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=void 0),delete n[i.i];e._f=e._l=void 0,e[wt]=0},delete:function(e){var n=yt(this,t),i=kt(n,e);if(i){var r=i.n,o=i.p;delete n._i[i.i],i.r=!0,o&&(o.n=r),r&&(r.p=o),n._f==i&&(n._f=r),n._l==i&&(n._l=o),n[wt]--}return!!i},forEach:function(e){yt(this,t);for(var n,i=E(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(i(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!kt(yt(this,t),e)}}),s&&vt(r.prototype,"size",{get:function(){return yt(this,t)[wt]}}),r},def:function(e,t,n){var i,r,o=kt(e,t);return o?o.v=n:(e._l=o={i:r=bt(t,!0),k:t,v:n,p:i=e._l,n:void 0,r:!1},e._f||(e._f=o),i&&(i.n=o),e[wt]++,"F"!==r&&(e._i[r]=o)),e},getEntry:kt,setStrong:function(e,t,n){rt(e,t,function(e,n){this._t=yt(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?Xe(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,Xe(1))},n?"entries":"values",!n,!0),ve(t)}},St=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},Et={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=E(Function.call,ht.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return St(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:St},_t=Et.set,At=function(e,t,i,o,s,l){var c=n[e],u=c,f=s?"set":"add",h=u&&u.prototype,d={},p=function(e){var t=h[e];T(h,e,"delete"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return l&&!r(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(l||h.forEach&&!a(function(){(new u).entries().next()}))){var g=new u,m=g[f](l?{}:-0,1)!=g,y=a(function(){g.has(1)}),v=lt(function(e){new u(e)}),b=!l&&a(function(){for(var e=new u,t=5;t--;)e[f](t,t);return!e.has(-0)});v||((u=t(function(t,n){F(t,u,e);var i=function(e,t,n){var i,o=t.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&r(i)&&_t&&_t(e,i),e}(new c,t,u);return null!=n&>(n,s,i[f],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),s&&p("get")),(b||m)&&p(f),l&&h.clear&&delete h.clear}else u=o.getConstructor(t,e,s,f),I(u.prototype,i),mt.NEED=!0;return de(u,e),d[e]=u,P(P.G+P.W+P.F*(u!=c),d),l||o.setStrong(u,e,s),u},Pt=(At("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=Tt.getEntry(yt(this,"Map"),e);return t&&t.v},set:function(e,t){return Tt.def(yt(this,"Map"),0===e?0:e,t)}},Tt,!0),At("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Tt.def(yt(this,"Set"),e=0===e?0:e,e)}},Tt),{f:Object.getOwnPropertySymbols}),Mt=Object.assign,Lt=!Mt||a(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Mt({},e)[n]||Object.keys(Mt({},t)).join("")!=i})?function(e,t){for(var n=le(e),i=arguments.length,r=1,o=Pt.f,a=ut.f;i>r;)for(var s,l=z(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,f=0;u>f;)a.call(l,s=c[f++])&&(n[s]=l[s]);return n}:Mt,Ct=mt.getWeak,xt=Ye(5),Ot=Ye(6),Nt=0,jt=function(e){return e._l||(e._l=new It)},It=function(){this.a=[]},Ft=function(e,t){return xt(e.a,function(e){return e[0]===t})};It.prototype={get:function(e){var t=Ft(this,e);if(t)return t[1]},has:function(e){return!!Ft(this,e)},set:function(e,t){var n=Ft(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Ot(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Rt={getConstructor:function(e,t,n,i){var o=e(function(e,r){F(e,o,t,"_i"),e._t=t,e._i=Nt++,e._l=void 0,null!=r&>(r,n,e[i],e)});return I(o.prototype,{delete:function(e){if(!r(e))return!1;var n=Ct(e);return!0===n?jt(yt(this,t)).delete(e):n&&v(n,this._i)&&delete n[this._i]},has:function(e){if(!r(e))return!1;var n=Ct(e);return!0===n?jt(yt(this,t)).has(e):n&&v(n,this._i)}}),o},def:function(e,t,n){var i=Ct(o(t),!0);return!0===i?jt(e).set(t,n):i[e._i]=n,e},ufstore:jt};t(function(e){var t,n=Ye(0),i=mt.getWeak,o=Object.isExtensible,s=Rt.ufstore,l={},c=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},u={get:function(e){if(r(e)){var t=i(e);return!0===t?s(yt(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Rt.def(yt(this,"WeakMap"),e,t)}},f=e.exports=At("WeakMap",c,u,Rt,!0,!0);a(function(){return 7!=(new f).set((Object.freeze||Object)(l),7).get(l)})&&(t=Rt.getConstructor(c,"WeakMap"),Lt(t.prototype,u),mt.NEED=!0,n(["delete","has","get","set"],function(e){var n=f.prototype,i=n[e];T(n,e,function(n,a){if(r(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,a);return"set"==e?this:s}return i.call(this,n,a)})}))});At("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Rt.def(yt(this,"WeakSet"),e,!0)}},Rt,!1,!0);var qt=(n.Reflect||{}).apply,Vt=Function.apply;P(P.S+P.F*!a(function(){qt(function(){})}),"Reflect",{apply:function(e,t,n){var i=S(e),r=o(n);return qt?qt(i,t,r):Vt.call(i,t,r)}});var Dt=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Bt=[].slice,Ut={},Ht=Function.bind||function(e){var t=S(this),n=Bt.call(arguments,1),i=function(){var r=n.concat(Bt.call(arguments));return this instanceof i?function(e,t,n){if(!(t in Ut)){for(var i=[],r=0;r<t;r++)i[r]="a["+r+"]";Ut[t]=Function("F,a","return new F("+i.join(",")+")")}return Ut[t](e,n)}(t,r.length,r):Dt(t,r,e)};return r(t.prototype)&&(i.prototype=t.prototype),i},Wt=(n.Reflect||{}).construct,zt=a(function(){function e(){}return!(Wt(function(){},[],e)instanceof e)}),Gt=!a(function(){Wt(function(){})});P(P.S+P.F*(zt||Gt),"Reflect",{construct:function(e,t){S(e),o(t);var n=arguments.length<3?e:S(arguments[2]);if(Gt&&!zt)return Wt(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(Ht.apply(e,i))}var a=n.prototype,s=Ve(r(a)?a:Object.prototype),l=Function.apply.call(e,s,t);return r(l)?l:s}}),P(P.S+P.F*a(function(){Reflect.defineProperty(p.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,n){o(e),t=h(t,!0),o(n);try{return p.f(e,t,n),!0}catch(e){return!1}}});var Kt=ht.f;P(P.S,"Reflect",{deleteProperty:function(e,t){var n=Kt(o(e),t);return!(n&&!n.configurable)&&delete e[t]}}),P(P.S,"Reflect",{get:function e(t,n){var i,a,s=arguments.length<3?t:arguments[2];return o(t)===s?t[n]:(i=ht.f(t,n))?v(i,"value")?i.value:void 0!==i.get?i.get.call(s):void 0:r(a=Ue(t))?e(a,n,s):void 0}}),P(P.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return ht.f(o(e),t)}}),P(P.S,"Reflect",{getPrototypeOf:function(e){return Ue(o(e))}}),P(P.S,"Reflect",{has:function(e,t){return t in e}});var Yt=Object.isExtensible;P(P.S,"Reflect",{isExtensible:function(e){return o(e),!Yt||Yt(e)}});var Qt=n.Reflect,Jt=Qt&&Qt.ownKeys||function(e){var t=se.f(o(e)),n=Pt.f;return n?t.concat(n(e)):t};P(P.S,"Reflect",{ownKeys:Jt});var $t=Object.preventExtensions;P(P.S,"Reflect",{preventExtensions:function(e){o(e);try{return $t&&$t(e),!0}catch(e){return!1}}}),P(P.S,"Reflect",{set:function e(t,n,i){var a,s,l=arguments.length<4?t:arguments[3],c=ht.f(o(t),n);if(!c){if(r(s=Ue(t)))return e(s,n,i,l);c=g(0)}return v(c,"value")?!(!1===c.writable||!r(l)||((a=ht.f(l,n)||g(0)).value=i,p.f(l,n,a),0)):void 0!==c.set&&(c.set.call(l,i),!0)}}),Et&&P(P.S,"Reflect",{setPrototypeOf:function(e,t){Et.check(e,t);try{return Et.set(e,t),!0}catch(e){return!1}}});var Xt,Zt,en,tn=n.process,nn=n.setImmediate,rn=n.clearImmediate,on=n.MessageChannel,an=n.Dispatch,sn=0,ln={},cn=function(){var e=+this;if(ln.hasOwnProperty(e)){var t=ln[e];delete ln[e],t()}},un=function(e){cn.call(e.data)};nn&&rn||(nn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ln[++sn]=function(){Dt("function"==typeof e?e:Function(e),t)},Xt(sn),sn},rn=function(e){delete ln[e]},"process"==W(tn)?Xt=function(e){tn.nextTick(E(cn,e,1))}:an&&an.now?Xt=function(e){an.now(E(cn,e,1))}:on?(en=(Zt=new on).port2,Zt.port1.onmessage=un,Xt=E(en.postMessage,en,1)):n.addEventListener&&"function"==typeof postMessage&&!n.importScripts?(Xt=function(e){n.postMessage(e+"","*")},n.addEventListener("message",un,!1)):Xt="onreadystatechange"in u("script")?function(e){Ie.appendChild(u("script")).onreadystatechange=function(){Ie.removeChild(this),cn.call(e)}}:function(e){setTimeout(E(cn,e,1),0)});var fn={set:nn,clear:rn},hn=fn.set,dn=n.MutationObserver||n.WebKitMutationObserver,pn=n.process,gn=n.Promise,mn="process"==W(pn);function yn(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=S(t),this.reject=S(n)}var vn,bn,wn,kn,Tn={f:function(e){return new yn(e)}},Sn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},En=fn.set,_n=function(){var e,t,i,r=function(){var n,r;for(mn&&(n=pn.domain)&&n.exit();e;){r=e.fn,e=e.next;try{r()}catch(n){throw e?i():t=void 0,n}}t=void 0,n&&n.enter()};if(mn)i=function(){pn.nextTick(r)};else if(!dn||n.navigator&&n.navigator.standalone)if(gn&&gn.resolve){var o=gn.resolve();i=function(){o.then(r)}}else i=function(){hn.call(n,r)};else{var a=!0,s=document.createTextNode("");new dn(r).observe(s,{characterData:!0}),i=function(){s.data=a=!a}}return function(n){var r={fn:n,next:void 0};t&&(t.next=r),e||(e=r,i()),t=r}}(),An=n.TypeError,Pn=n.process,Mn=n.Promise,Ln="process"==Pe(Pn),Cn=function(){},xn=bn=Tn.f,On=!!function(){try{var e=Mn.resolve(1),t=(e.constructor={})[ue("species")]=function(e){e(Cn,Cn)};return(Ln||"function"==typeof PromiseRejectionEvent)&&e.then(Cn)instanceof t}catch(e){}}(),Nn=function(e){var t;return!(!r(e)||"function"!=typeof(t=e.then))&&t},jn=function(e,t){if(!e._n){e._n=!0;var n=e._c;_n(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a=r?t.ok:t.fail,s=t.resolve,l=t.reject,c=t.domain;try{a?(r||(2==e._h&&Rn(e),e._h=1),!0===a?n=i:(c&&c.enter(),n=a(i),c&&c.exit()),n===t.promise?l(An("Promise-chain cycle")):(o=Nn(n))?o.call(n,s,l):s(n)):l(i)}catch(e){l(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&In(e)})}},In=function(e){En.call(n,function(){var t,i,r,o=e._v,a=Fn(e);if(a&&(t=Sn(function(){Ln?Pn.emit("unhandledRejection",o,e):(i=n.onunhandledrejection)?i({promise:e,reason:o}):(r=n.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=Ln||Fn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Fn=function(e){return 1!==e._h&&0===(e._a||e._c).length},Rn=function(e){En.call(n,function(){var t;Ln?Pn.emit("rejectionHandled",e):(t=n.onrejectionhandled)&&t({promise:e,reason:e._v})})},qn=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),jn(t,!0))},Vn=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw An("Promise can't be resolved itself");(t=Nn(e))?_n(function(){var i={_w:n,_d:!1};try{t.call(e,E(Vn,i,1),E(qn,i,1))}catch(e){qn.call(i,e)}}):(n._v=e,n._s=1,jn(n,!1))}catch(e){qn.call({_w:n,_d:!1},e)}}};On||(Mn=function(e){F(this,Mn,"Promise","_h"),S(e),vn.call(this);try{e(E(Vn,this,1),E(qn,this,1))}catch(e){qn.call(this,e)}},(vn=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=I(Mn.prototype,{then:function(e,t){var n=xn(me(this,Mn));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=Ln?Pn.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&jn(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),wn=function(){var e=new vn;this.promise=e,this.resolve=E(Vn,e,1),this.reject=E(qn,e,1)},Tn.f=xn=function(e){return e===Mn||e===kn?new wn(e):bn(e)}),P(P.G+P.W+P.F*!On,{Promise:Mn}),de(Mn,"Promise"),ve("Promise"),kn=i.Promise,P(P.S+P.F*!On,"Promise",{reject:function(e){var t=xn(this);return(0,t.reject)(e),t.promise}}),P(P.S+P.F*!On,"Promise",{resolve:function(e){return function(e,t){if(o(e),r(t)&&t.constructor===e)return t;var n=Tn.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),P(P.S+P.F*!(On&<(function(e){Mn.all(e).catch(Cn)})),"Promise",{all:function(e){var t=this,n=xn(t),i=n.resolve,r=n.reject,o=Sn(function(){var n=[],o=0,a=1;gt(e,!1,function(e){var s=o++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||i(n))},r)}),--a||i(n)});return o.e&&r(o.v),n.promise},race:function(e){var t=this,n=xn(t),i=n.reject,r=Sn(function(){gt(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Dn={f:ue},Bn=p.f,Un=function(e){var t=i.Symbol||(i.Symbol=n.Symbol||{});"_"==e.charAt(0)||e in t||Bn(t,e,{value:Dn.f(e)})},Hn=se.f,Wn={}.toString,zn="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Gn={f:function(e){return zn&&"[object Window]"==Wn.call(e)?function(e){try{return Hn(e)}catch(e){return zn.slice()}}(e):Hn(K(e))}},Kn=mt.KEY,Yn=ht.f,Qn=p.f,Jn=Gn.f,$n=n.Symbol,Xn=n.JSON,Zn=Xn&&Xn.stringify,ei=ue("_hidden"),ti=ue("toPrimitive"),ni={}.propertyIsEnumerable,ii=Z("symbol-registry"),ri=Z("symbols"),oi=Z("op-symbols"),ai=Object.prototype,si="function"==typeof $n,li=n.QObject,ci=!li||!li.prototype||!li.prototype.findChild,ui=s&&a(function(){return 7!=Ve(Qn({},"a",{get:function(){return Qn(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=Yn(ai,t);i&&delete ai[t],Qn(e,t,n),i&&e!==ai&&Qn(ai,t,i)}:Qn,fi=function(e){var t=ri[e]=Ve($n.prototype);return t._k=e,t},hi=si&&"symbol"==typeof $n.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $n},di=function(e,t,n){return e===ai&&di(oi,t,n),o(e),t=h(t,!0),o(n),v(ri,t)?(n.enumerable?(v(e,ei)&&e[ei][t]&&(e[ei][t]=!1),n=Ve(n,{enumerable:g(0,!1)})):(v(e,ei)||Qn(e,ei,g(1,{})),e[ei][t]=!0),ui(e,t,n)):Qn(e,t,n)},pi=function(e,t){o(e);for(var n,i=function(e){var t=Oe(e),n=Pt.f;if(n)for(var i,r=n(e),o=ut.f,a=0;r.length>a;)o.call(e,i=r[a++])&&t.push(i);return t}(t=K(t)),r=0,a=i.length;a>r;)di(e,n=i[r++],t[n]);return e},gi=function(e){var t=ni.call(this,e=h(e,!0));return!(this===ai&&v(ri,e)&&!v(oi,e))&&(!(t||!v(this,e)||!v(ri,e)||v(this,ei)&&this[ei][e])||t)},mi=function(e,t){if(e=K(e),t=h(t,!0),e!==ai||!v(ri,t)||v(oi,t)){var n=Yn(e,t);return!n||!v(ri,t)||v(e,ei)&&e[ei][t]||(n.enumerable=!0),n}},yi=function(e){for(var t,n=Jn(K(e)),i=[],r=0;n.length>r;)v(ri,t=n[r++])||t==ei||t==Kn||i.push(t);return i},vi=function(e){for(var t,n=e===ai,i=Jn(n?oi:K(e)),r=[],o=0;i.length>o;)!v(ri,t=i[o++])||n&&!v(ai,t)||r.push(ri[t]);return r};si||(T(($n=function(){if(this instanceof $n)throw TypeError("Symbol is not a constructor!");var e=k(arguments.length>0?arguments[0]:void 0),t=function(n){this===ai&&t.call(oi,n),v(this,ei)&&v(this[ei],e)&&(this[ei][e]=!1),ui(this,e,g(1,n))};return s&&ci&&ui(ai,e,{configurable:!0,set:t}),fi(e)}).prototype,"toString",function(){return this._k}),ht.f=mi,p.f=di,se.f=Gn.f=yi,ut.f=gi,Pt.f=vi,s&&T(ai,"propertyIsEnumerable",gi,!0),Dn.f=function(e){return fi(ue(e))}),P(P.G+P.W+P.F*!si,{Symbol:$n});for(var bi="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),wi=0;bi.length>wi;)ue(bi[wi++]);for(var ki=Oe(ue.store),Ti=0;ki.length>Ti;)Un(ki[Ti++]);P(P.S+P.F*!si,"Symbol",{for:function(e){return v(ii,e+="")?ii[e]:ii[e]=$n(e)},keyFor:function(e){if(!hi(e))throw TypeError(e+" is not a symbol!");for(var t in ii)if(ii[t]===e)return t},useSetter:function(){ci=!0},useSimple:function(){ci=!1}}),P(P.S+P.F*!si,"Object",{create:function(e,t){return void 0===t?Ve(e):pi(Ve(e),t)},defineProperty:di,defineProperties:pi,getOwnPropertyDescriptor:mi,getOwnPropertyNames:yi,getOwnPropertySymbols:vi}),Xn&&P(P.S+P.F*(!si||a(function(){var e=$n();return"[null]"!=Zn([e])||"{}"!=Zn({a:e})||"{}"!=Zn(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(n=t=i[1],(r(t)||void 0!==e)&&!hi(e))return ze(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!hi(t))return t}),i[1]=t,Zn.apply(Xn,i)}}),$n.prototype[ti]||m($n.prototype,ti,$n.prototype.valueOf),de($n,"Symbol"),de(Math,"Math",!0),de(n.JSON,"JSON",!0);var Si=function(e,t){var n=(i.Object||{})[e]||Object[e],r={};r[e]=t(n),P(P.S+P.F*a(function(){n(1)}),"Object",r)},Ei=mt.onFreeze;Si("freeze",function(e){return function(t){return e&&r(t)?e(Ei(t)):t}});var _i=mt.onFreeze;Si("seal",function(e){return function(t){return e&&r(t)?e(_i(t)):t}});var Ai=mt.onFreeze;Si("preventExtensions",function(e){return function(t){return e&&r(t)?e(Ai(t)):t}}),Si("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}});var Pi=ht.f;Si("getOwnPropertyDescriptor",function(){return function(e,t){return Pi(K(e),t)}}),Si("getPrototypeOf",function(){return function(e){return Ue(le(e))}}),Si("keys",function(){return function(e){return Oe(le(e))}}),Si("getOwnPropertyNames",function(){return Gn.f}),P(P.S+P.F,"Object",{assign:Lt});var Mi=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};P(P.S,"Object",{is:Mi});var Li=p.f,Ci=Function.prototype,xi=/^\s*function ([^ (]*)/;"name"in Ci||s&&Li(Ci,"name",{configurable:!0,get:function(){try{return(""+this).match(xi)[1]}catch(e){return""}}}),P(P.S,"String",{raw:function(e){for(var t=K(e.raw),n=B(t.length),i=arguments.length,r=[],o=0;n>o;)r.push(String(t[o++])),o<i&&r.push(String(arguments[o]));return r.join("")}});var Oi=String.fromCharCode,Ni=String.fromCodePoint;P(P.S+P.F*(!!Ni&&1!=Ni.length),"String",{fromCodePoint:function(e){for(var t,n=[],i=arguments.length,r=0;i>r;){if(t=+arguments[r++],J(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?Oi(t):Oi(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}});var ji,Ii=(ji=!1,function(e,t){var n,i,r=String(G(e)),o=V(t),a=r.length;return o<0||o>=a?ji?"":void 0:(n=r.charCodeAt(o))<55296||n>56319||o+1===a||(i=r.charCodeAt(o+1))<56320||i>57343?ji?r.charAt(o):n:ji?r.slice(o,o+2):i-56320+(n-55296<<10)+65536});P(P.P,"String",{codePointAt:function(e){return Ii(this,e)}});var Fi=function(e){var t=String(G(this)),n="",i=V(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n};P(P.P,"String",{repeat:Fi});var Ri=ue("match"),qi=function(e){var t;return r(e)&&(void 0!==(t=e[Ri])?!!t:"RegExp"==W(e))},Vi=function(e,t,n){if(qi(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(G(e))},Di=ue("match"),Bi=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Di]=!1,!"/./"[e](t)}catch(e){}}return!0},Ui="".startsWith;P(P.P+P.F*Bi("startsWith"),"String",{startsWith:function(e){var t=Vi(this,e,"startsWith"),n=B(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return Ui?Ui.call(t,i,n):t.slice(n,n+i.length)===i}});var Hi="".endsWith;P(P.P+P.F*Bi("endsWith"),"String",{endsWith:function(e){var t=Vi(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,i=B(t.length),r=void 0===n?i:Math.min(B(n),i),o=String(e);return Hi?Hi.call(t,o,r):t.slice(r-o.length,r)===o}});P(P.P+P.F*Bi("includes"),"String",{includes:function(e){return!!~Vi(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});s&&"g"!=/./g.flags&&p.f(RegExp.prototype,"flags",{configurable:!0,get:function(){var e=o(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}});var Wi=function(e,t,n){var i=ue(e),r=n(G,i,""[e]),o=r[0],s=r[1];a(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(T(String.prototype,e,o),m(RegExp.prototype,i,2==t?function(e,t){return s.call(e,this,t)}:function(e){return s.call(e,this)}))};Wi("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]}),Wi("replace",2,function(e,t,n){return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("split",2,function(e,t,n){var i=qi,r=n,o=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var a=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,f,h=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,d+"g");for(a||(s=new RegExp("^"+m.source+"$(?!\\s)",d));(l=m.exec(n))&&!((c=l.index+l[0].length)>p&&(h.push(n.slice(p,l.index)),!a&&l.length>1&&l[0].replace(s,function(){for(f=1;f<arguments.length-2;f++)void 0===arguments[f]&&(l[f]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=g));)m.lastIndex===l.index&&m.lastIndex++;return p===n.length?!u&&m.test("")||h.push(""):h.push(n.slice(p)),h.length>g?h.slice(0,g):h}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var o=e(this),a=null==i?void 0:i[t];return void 0!==a?a.call(i,o,r):n.call(String(o),i,r)},n]}),Wi("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var zi=function(e,t,n){t in e?p.f(e,t,g(0,n)):e[t]=n};P(P.S+P.F*!lt(function(e){}),"Array",{from:function(e){var t,n,i,r,o=le(e),a="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,f=We(o);if(c&&(l=E(l,s>2?arguments[2]:void 0,2)),null==f||a==Array&&xe(f))for(n=new a(t=B(o.length));t>u;u++)zi(n,u,c?l(o[u],u):o[u]);else for(r=f.call(o),n=new a;!(i=r.next()).done;u++)zi(n,u,c?pt(r,l,[i.value,u],!0):i.value);return n.length=u,n}}),P(P.S+P.F*a(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)zi(n,e,arguments[e++]);return n.length=t,n}}),P(P.P,"Array",{copyWithin:ct}),$e("copyWithin");var Gi=Ye(5),Ki=!0;"find"in[]&&Array(1).find(function(){Ki=!1}),P(P.P+P.F*Ki,"Array",{find:function(e){return Gi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("find");var Yi=Ye(6),Qi=!0;"findIndex"in[]&&Array(1).findIndex(function(){Qi=!1}),P(P.P+P.F*Qi,"Array",{findIndex:function(e){return Yi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("findIndex"),P(P.P,"Array",{fill:ce}),$e("fill");var Ji=n.isFinite;P(P.S,"Number",{isFinite:function(e){return"number"==typeof e&&Ji(e)}});var $i=Math.floor,Xi=function(e){return!r(e)&&isFinite(e)&&$i(e)===e};P(P.S,"Number",{isInteger:Xi});var Zi=Math.abs;P(P.S,"Number",{isSafeInteger:function(e){return Xi(e)&&Zi(e)<=9007199254740991}}),P(P.S,"Number",{isNaN:function(e){return e!=e}}),P(P.S,"Number",{EPSILON:Math.pow(2,-52)}),P(P.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991}),P(P.S,"Number",{MAX_SAFE_INTEGER:9007199254740991});var er=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)},tr=Math.sqrt,nr=Math.acosh;P(P.S+P.F*!(nr&&710==Math.floor(nr(Number.MAX_VALUE))&&nr(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:er(e-1+tr(e-1)*tr(e+1))}});var ir=Math.asinh;P(P.S+P.F*!(ir&&1/ir(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}});var rr=Math.atanh;P(P.S+P.F*!(rr&&1/rr(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}});var or=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};P(P.S,"Math",{cbrt:function(e){return or(e=+e)*Math.pow(Math.abs(e),1/3)}}),P(P.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}});var ar=Math.exp;P(P.S,"Math",{cosh:function(e){return(ar(e=+e)+ar(-e))/2}});var sr=Math.expm1,lr=!sr||sr(10)>22025.465794806718||sr(10)<22025.465794806718||-2e-17!=sr(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:sr;P(P.S+P.F*(lr!=Math.expm1),"Math",{expm1:lr});var cr=Math.pow,ur=cr(2,-52),fr=cr(2,-23),hr=cr(2,127)*(2-fr),dr=cr(2,-126),pr=Math.fround||function(e){var t,n,i=Math.abs(e),r=or(e);return i<dr?r*(i/dr/fr+1/ur-1/ur)*dr*fr:(n=(t=(1+fr/ur)*i)-(t-i))>hr||n!=n?r*(1/0):r*n};P(P.S,"Math",{fround:pr});var gr=Math.abs;P(P.S,"Math",{hypot:function(e,t){for(var n,i,r=0,o=0,a=arguments.length,s=0;o<a;)s<(n=gr(arguments[o++]))?(r=r*(i=s/n)*i+1,s=n):r+=n>0?(i=n/s)*i:n;return s===1/0?1/0:s*Math.sqrt(r)}});var mr=Math.imul;P(P.S+P.F*a(function(){return-5!=mr(4294967295,5)||2!=mr.length}),"Math",{imul:function(e,t){var n=+e,i=+t,r=65535&n,o=65535&i;return 0|r*o+((65535&n>>>16)*o+r*(65535&i>>>16)<<16>>>0)}}),P(P.S,"Math",{log1p:er}),P(P.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}}),P(P.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}}),P(P.S,"Math",{sign:or});var yr=Math.exp;P(P.S+P.F*a(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(lr(e)-lr(-e))/2:(yr(e-1)-yr(-e-1))*(Math.E/2)}});var vr=Math.exp;P(P.S,"Math",{tanh:function(e){var t=lr(e=+e),n=lr(-e);return t==1/0?1:n==1/0?-1:(t-n)/(vr(e)+vr(-e))}}),P(P.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var br=$(!0);P(P.P,"Array",{includes:function(e){return br(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("includes");var wr=ut.f,kr=function(e){return function(t){for(var n,i=K(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)wr.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},Tr=kr(!1);P(P.S,"Object",{values:function(e){return Tr(e)}});var Sr=kr(!0);P(P.S,"Object",{entries:function(e){return Sr(e)}}),P(P.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,i=K(e),r=ht.f,o=Jt(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&zi(a,t,n);return a}});var Er=function(e,t,n,i){var r=String(G(e)),o=r.length,a=void 0===n?" ":String(n),s=B(t);if(s<=o||""==a)return r;var l=s-o,c=Fi.call(a,Math.ceil(l/a.length));return c.length>l&&(c=c.slice(0,l)),i?c+r:r+c},_r=n.navigator,Ar=_r&&_r.userAgent||"";P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padStart:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!0)}}),P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padEnd:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!1)}});var Pr=[].slice,Mr=/MSIE .\./.test(Ar),Lr=function(e){return function(t,n){var i=arguments.length>2,r=!!i&&Pr.call(arguments,2);return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};P(P.G+P.B+P.F*Mr,{setTimeout:Lr(n.setTimeout),setInterval:Lr(n.setInterval)}),P(P.G+P.B,{setImmediate:fn.set,clearImmediate:fn.clear});for(var Cr=ue("iterator"),xr=ue("toStringTag"),Or=Me.Array,Nr={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},jr=Oe(Nr),Ir=0;Ir<jr.length;Ir++){var Fr,Rr=jr[Ir],qr=Nr[Rr],Vr=n[Rr],Dr=Vr&&Vr.prototype;if(Dr&&(Dr[Cr]||m(Dr,Cr,Or),Dr[xr]||m(Dr,xr,Rr),Me[Rr]=Or,qr))for(Fr in ot)Dr[Fr]||T(Dr,Fr,ot[Fr],!0)}t(function(t){!function(e){var n,i=Object.prototype,r=i.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",s=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag",c=e.regeneratorRuntime;if(c)t.exports=c;else{(c=e.regeneratorRuntime=t.exports).wrap=b;var u="suspendedStart",f="suspendedYield",h="executing",d="completed",p={},g={};g[a]=function(){return this};var m=Object.getPrototypeOf,y=m&&m(m(C([])));y&&y!==i&&r.call(y,a)&&(g=y);var v=S.prototype=k.prototype=Object.create(g);T.prototype=v.constructor=S,S.constructor=T,S[l]=T.displayName="GeneratorFunction",c.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===T||"GeneratorFunction"===(t.displayName||t.name))},c.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,S):(e.__proto__=S,l in e||(e[l]="GeneratorFunction")),e.prototype=Object.create(v),e},c.awrap=function(e){return{__await:e}},E(_.prototype),_.prototype[s]=function(){return this},c.AsyncIterator=_,c.async=function(e,t,n,i){var r=new _(b(e,t,n,i));return c.isGeneratorFunction(t)?r:r.next().then(function(e){return e.done?e.value:r.next()})},E(v),v[l]="Generator",v[a]=function(){return this},v.toString=function(){return"[object Generator]"},c.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},c.values=C,L.prototype={constructor:L,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(M),!e)for(var t in this)"t"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function i(i,r){return s.type="throw",s.arg=e,t.next=i,r&&(t.method="next",t.arg=n),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],s=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),c=r.call(a,"finallyLoc");if(l&&c){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),M(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;M(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:C(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),p}}}function b(e,t,n,i){var r=t&&t.prototype instanceof k?t:k,o=Object.create(r.prototype),a=new L(i||[]);return o._invoke=function(e,t,n){var i=u;return function(r,o){if(i===h)throw new Error("Generator is already running");if(i===d){if("throw"===r)throw o;return x()}for(n.method=r,n.arg=o;;){var a=n.delegate;if(a){var s=A(a,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===u)throw i=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var l=w(e,t,n);if("normal"===l.type){if(i=n.done?d:f,l.arg===p)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(i=d,n.method="throw",n.arg=l.arg)}}}(e,n,a),o}function w(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function k(){}function T(){}function S(){}function E(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function _(t){function n(e,i,o,a){var s=w(t[e],t,i);if("throw"!==s.type){var l=s.arg,c=l.value;return c&&"object"==typeof c&&r.call(c,"__await")?Promise.resolve(c.__await).then(function(e){n("next",e,o,a)},function(e){n("throw",e,o,a)}):Promise.resolve(c).then(function(e){l.value=e,o(l)},a)}a(s.arg)}var i;"object"==typeof e.process&&e.process.domain&&(n=e.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise(function(i,r){n(e,t,i,r)})}return i=i?i.then(r,r):r()}}function A(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,A(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=w(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function M(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function C(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function t(){for(;++i<e.length;)if(r.call(e,i))return t.value=e[i],t.done=!1,t;return t.value=n,t.done=!0,t};return o.next=o}}return{next:x}}function x(){return{value:n,done:!0}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:e)});try{var Br=new window.CustomEvent("test");if(Br.preventDefault(),!0!==Br.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var Ur=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};Ur.prototype=window.Event.prototype,window.CustomEvent=Ur}!function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var o=function(e){if(Object.defineProperty(this,"_entries",{value:{}}),"string"==typeof e){if(""!==e)for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}else if(e instanceof o){var a=this;e.forEach(function(e,t){a.append(e,t)})}},a=o.prototype;a.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},a.delete=function(e){delete this._entries[e]},a.get=function(e){return e in this._entries?this._entries[e][0]:null},a.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},a.has=function(e){return e in this._entries},a.set=function(e,t){this._entries[e]=[t.toString()]},a.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},a.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},a.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},a.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(a[Symbol.iterator]=a.entries),a.toString=function(){var e="";return this.forEach(function(t,n){e.length>0&&(e+="&"),e+=i(n)+"="+i(t)}),e},e.URLSearchParams=o}()}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(e,t){"string"!=typeof e&&(e=String(e));var n=document.implementation.createHTMLDocument("");if(window.doc=n,t){var i=n.createElement("base");i.href=t,n.head.appendChild(i)}var r=n.createElement("a");if(r.href=e,n.body.appendChild(r),r.href=r.href,":"===r.protocol||!/:/.test(r.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:r})},i=n.prototype;["hash","host","hostname","port","protocol","search"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0},searchParams:{get:function(){var e=new URLSearchParams(this.search),t=this;return["append","delete","set"].forEach(function(n){var i=e[n];e[n]=function(){i.apply(e,arguments),t.search=e.toString()}}),e},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var Hr=function(e){return null!=e?e.constructor:null},Wr=function(e,t){return Boolean(e&&t&&e instanceof t)},zr={object:function(e){return Hr(e)===Object},number:function(e){return Hr(e)===Number&&!Number.isNaN(e)},string:function(e){return Hr(e)===String},boolean:function(e){return Hr(e)===Boolean},function:function(e){return Hr(e)===Function},array:function(e){return!zr.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return Wr(e,WeakMap)},nodeList:function(e){return Wr(e,NodeList)},element:function(e){return Wr(e,Element)},textNode:function(e){return Hr(e)===Text},event:function(e){return Wr(e,Event)},cue:function(e){return Wr(e,window.TextTrackCue)||Wr(e,window.VTTCue)},track:function(e){return Wr(e,TextTrack)||!zr.nullOrUndefined(e)&&zr.string(e.kind)},url:function(e){return!zr.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return zr.nullOrUndefined(e)||(zr.string(e)||zr.array(e)||zr.nodeList(e))&&!e.length||zr.object(e)&&!Object.keys(e).length}},Gr=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function Kr(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(!zr.empty(e)&&!zr.empty(t)&&zr.function(n))if(zr.nodeList(e)||zr.array(e))Array.from(e).forEach(function(e){e instanceof Node&&Kr.call(null,e,t,n,i,r,o)});else{var a=t.split(" "),s=o;Gr&&(s={passive:r,capture:o}),a.forEach(function(t){e[i?"addEventListener":"removeEventListener"](t,n,s)})}}function Yr(e){Kr(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",arguments[2],!0,!(arguments.length>3&&void 0!==arguments[3])||arguments[3],arguments.length>4&&void 0!==arguments[4]&&arguments[4])}function Qr(e){Kr(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",arguments[2],!1,!(arguments.length>3&&void 0!==arguments[3])||arguments[3],arguments.length>4&&void 0!==arguments[4]&&arguments[4])}function Jr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(zr.element(e)&&!zr.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}var $r=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},Xr=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),Zr=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},eo=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],i=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);i=!0);}catch(e){r=!0,o=e}finally{try{!i&&s.return&&s.return()}finally{if(r)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function to(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,o=e.nextSibling;i.appendChild(e),o?r.insertBefore(i,o):r.appendChild(i)})}function no(e,t){zr.element(e)&&!zr.empty(t)&&Object.entries(t).forEach(function(t){var n=eo(t,2),i=n[0],r=n[1];e.setAttribute(i,r)})}function io(e,t,n){var i=document.createElement(e);return zr.object(t)&&no(i,t),zr.string(n)&&(i.innerText=n),i}function ro(e,t,n,i){t.appendChild(io(e,n,i))}function oo(e){zr.nodeList(e)||zr.array(e)?Array.from(e).forEach(oo):zr.element(e)&&zr.element(e.parentNode)&&e.parentNode.removeChild(e)}function ao(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function so(e,t){return zr.element(t)&&zr.element(t.parentNode)&&zr.element(e)?(t.parentNode.replaceChild(e,t),e):null}function lo(e,t){if(!zr.string(e)||zr.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=o[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":zr.object(i)&&zr.string(i.class)&&(i.class+=" "+r),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function co(e,t){if(zr.element(e)){var n=t;zr.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function uo(e,t,n){if(zr.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return null}function fo(e,t){return zr.element(e)&&e.classList.contains(t)}function ho(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function po(e){return this.elements.container.querySelectorAll(e)}function go(e){return this.elements.container.querySelector(e)}function mo(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}function yo(e,t){if(zr.array(e)||zr.nodeList(e))Array.from(e).forEach(function(e){return yo(e,t)});else if(zr.element(e)){var n="true"===e.getAttribute("aria-pressed"),i=zr.boolean(t)?t:!n;e.setAttribute("aria-pressed",i)}}var vo,bo,wo,ko=(vo=document.createElement("span"),bo={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},wo=Object.keys(bo).find(function(e){return void 0!==vo.style[e]}),!!zr.string(wo)&&bo[wo]);var To,So={browser:{isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)}},Eo={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=!1,r=!1,o=So.isIPhone&&n&&Eo.playsinline;switch(t+":"+e){case"html5:video":r=(i=Eo.video)&&Eo.rangeInput&&(!So.isIPhone||o);break;case"html5:audio":r=(i=Eo.audio)&&Eo.rangeInput;break;case"youtube:video":case"vimeo:video":i=!0,r=Eo.rangeInput&&(!So.isIPhone||o);break;default:r=(i=Eo.audio&&Eo.video)&&Eo.rangeInput}return{api:i,ui:r}},pip:!So.isIPhone&&zr.function(io("video").webkitSetPresentationMode),airplay:zr.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!zr.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),rangeInput:(To=document.createElement("input"),To.type="range","range"===To.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==ko,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};function _o(e){return zr.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}var Ao={getSources:function(){return this.isHTML5?this.media.querySelectorAll("source"):null},getQualityOptions:function(){if(!this.isHTML5)return null;var e=Ao.getSources.call(this);if(zr.empty(e))return null;var t=Array.from(e).filter(function(e){return!zr.empty(e.getAttribute("size"))});return zr.empty(t)?null:_o(t.map(function(e){return Number(e.getAttribute("size"))}))},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=Ao.getSources.call(e);if(zr.empty(t))return null;var n=Array.from(t).filter(function(t){return t.getAttribute("src")===e.source});return zr.empty(n)?null:Number(n[0].getAttribute("size"))},set:function(t){var n=Ao.getSources.call(e);if(!zr.empty(n)){var i=Array.from(n).filter(function(e){return Number(e.getAttribute("size"))===t});if(!zr.empty(i)){var r=i.filter(function(t){return Eo.mime.call(e,t.getAttribute("type"))});if(!zr.empty(r)){Jr.call(e,e.media,"qualityrequested",!1,{quality:t});var o=e.currentTime,a=e.playing;e.media.src=r[0].getAttribute("src");e.on("loadedmetadata",function t(){e.currentTime=o,e.off("loadedmetadata",t)}),e.media.load(),a&&e.play(),Jr.call(e,e.media,"qualitychange",!1,{quality:t})}}}}})}},cancelRequests:function(){this.isHTML5&&(oo(Ao.getSources()),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Po(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return zr.object(r)?(Object.keys(r).forEach(function(t){zr.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,Zr({},t,{})),Po(e[t],r[t])):Object.assign(e,Zr({},t,r[t]))}),Po.apply(void 0,[e].concat(n))):e}function Mo(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return zr.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return zr.string(n[t])?n[t]:""})}function Lo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),n.toString())}function Co(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function xo(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=Lo(e,"-"," "),e=Lo(e,"_"," "),Lo(e=Co(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Oo(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var No=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(zr.empty(e)||zr.empty(t))return"";var n,i=(n=t.i18n,e.split(".").reduce(function(e,t){return e&&e[t]},n));if(zr.empty(i))return"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach(function(e){var t=eo(e,2),n=t[0],r=t[1];i=Lo(i,n,r)}),i},jo=function(){function e(t){$r(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return Xr(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(zr.empty(n))return null;var i=JSON.parse(n);return zr.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&zr.object(t)){var n=this.get();zr.empty(n)&&(n={}),Po(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();var Io=function(e){return parseInt(e/60/60%60,10)},Fo=function(e){return parseInt(e/60%60,10)},Ro=function(e){return parseInt(e%60,10)};function qo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!zr.number(e))return qo(null,t,n);var i=function(e){return("0"+e).slice(-2)},r=Io(e),o=Fo(e),a=Ro(e);return t||r>0?r+=":":r="",(n?"-":"")+r+i(o)+":"+i(a)}var Vo={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||So.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=go.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:po.call(this,this.config.selectors.buttons.play),pause:go.call(this,this.config.selectors.buttons.pause),restart:go.call(this,this.config.selectors.buttons.restart),rewind:go.call(this,this.config.selectors.buttons.rewind),fastForward:go.call(this,this.config.selectors.buttons.fastForward),mute:go.call(this,this.config.selectors.buttons.mute),pip:go.call(this,this.config.selectors.buttons.pip),airplay:go.call(this,this.config.selectors.buttons.airplay),settings:go.call(this,this.config.selectors.buttons.settings),captions:go.call(this,this.config.selectors.buttons.captions),fullscreen:go.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=go.call(this,this.config.selectors.progress),this.elements.inputs={seek:go.call(this,this.config.selectors.inputs.seek),volume:go.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:go.call(this,this.config.selectors.display.buffer),currentTime:go.call(this,this.config.selectors.display.currentTime),duration:go.call(this,this.config.selectors.display.duration)},zr.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=Vo.getIconUrl.call(this),i=(n.cors?"":n.url)+"#"+this.config.iconPrefix,r=document.createElementNS("http://www.w3.org/2000/svg","svg");no(r,Po(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a=i+"-"+e;return"href"in o?o.setAttributeNS("http://www.w3.org/1999/xlink","href",a):o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a),r.appendChild(o),r},createLabel:function(e,t){var n=No(e,this.config),i=Object.assign({},t);switch(e){case"pip":n="PIP";break;case"airplay":n="AirPlay"}return"class"in i?i.class+=" "+this.config.classNames.hidden:i.class=this.config.classNames.hidden,io("span",i,n)},createBadge:function(e){if(zr.empty(e))return null;var t=io("span",{class:this.config.classNames.menu.value});return t.appendChild(io("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=io("button"),i=Object.assign({},t),r=xo(e),o=!1,a=void 0,s=void 0,l=void 0,c=void 0;switch("type"in i||(i.type="button"),"class"in i?i.class.includes(this.config.classNames.control)&&(i.class+=" "+this.config.classNames.control):i.class=this.config.classNames.control,e){case"play":o=!0,a="play",l="pause",s="play",c="pause";break;case"mute":o=!0,a="mute",l="unmute",s="volume",c="muted";break;case"captions":o=!0,a="enableCaptions",l="disableCaptions",s="captions-off",c="captions-on";break;case"fullscreen":o=!0,a="enterFullscreen",l="exitFullscreen",s="enter-fullscreen",c="exit-fullscreen";break;case"play-large":i.class+=" "+this.config.classNames.control+"--overlaid",r="play",a="play",s="play";break;default:a=r,s=e}return o?(n.appendChild(Vo.createIcon.call(this,c,{class:"icon--pressed"})),n.appendChild(Vo.createIcon.call(this,s,{class:"icon--not-pressed"})),n.appendChild(Vo.createLabel.call(this,l,{class:"label--pressed"})),n.appendChild(Vo.createLabel.call(this,a,{class:"label--not-pressed"})),i["aria-pressed"]=!1):(n.appendChild(Vo.createIcon.call(this,s)),n.appendChild(Vo.createLabel.call(this,a))),Po(i,lo(this.config.selectors.buttons[r],i)),no(n,i),"play"===r?(zr.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(n)):this.elements.buttons[r]=n,n},createRange:function(e,t){var n=io("label",{for:t.id,id:t.id+"-label",class:this.config.classNames.hidden},No(e,this.config)),i=io("input",Po(lo(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-labelledby":t.id+"-label","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,Vo.updateRangeFill.call(this,i),{label:n,input:i}},createProgress:function(e,t){var n=io("progress",Po(lo(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(io("span",null,"0"));var i="";switch(e){case"played":i=No("played",this.config);break;case"buffer":i=No("buffered",this.config)}n.innerText="% "+i.toLowerCase()}return this.elements.display[e]=n,n},createTime:function(e){var t=lo(this.config.selectors.display[e]),n=io("div",Po(t,{class:"plyr__time "+t.class,"aria-label":No(e,this.config)}),"00:00");return this.elements.display[e]=n,n},createMenuItem:function(e){var t=e.value,n=e.list,i=e.type,r=e.title,o=e.badge,a=void 0===o?null:o,s=e.checked,l=void 0!==s&&s,c=io("li"),u=io("label",{class:this.config.classNames.control}),f=io("input",Po(lo(this.config.selectors.inputs[i]),{type:"radio",name:"plyr-"+i,value:t,checked:l,class:"plyr__sr-only"})),h=io("span",{hidden:""});u.appendChild(f),u.appendChild(h),u.insertAdjacentHTML("beforeend",r),zr.element(a)&&u.appendChild(a),c.appendChild(u),n.appendChild(c)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(zr.element(e)&&zr.number(t)){var i=Io(this.duration)>0;e.innerText=qo(t,i,n)}},updateVolume:function(){this.supported.ui&&(zr.element(this.elements.inputs.volume)&&Vo.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),zr.element(this.elements.buttons.mute)&&yo(this.elements.buttons.mute,this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;zr.element(e)&&(e.value=t,Vo.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&zr.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&Vo.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=zr.number(n)?n:0,r=zr.element(e)?e:t.elements.display.buffer;if(zr.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];zr.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=zr.event(e)?e.target:e;zr.element(t)&&"range"===t.getAttribute("type")&&(t.setAttribute("aria-valuenow",t.value),So.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%"))},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&zr.element(this.elements.inputs.seek)&&zr.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r=this.config.classNames.tooltip+"--visible",o=function(e){uo(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(zr.event(e))n=100/i.width*(e.pageX-i.left);else{if(!fo(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),Vo.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",zr.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!zr.element(this.elements.display.duration)&&this.config.invertTime;Vo.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Vo.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){var e=zr.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Vo.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Vo.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),Vo.updateSeekTooltip.call(this)}},toggleTab:function(e,t){co(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(zr.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");zr.array(e)&&(this.options.quality=e.filter(function(e){return t.config.quality.options.includes(e)}));var i=!zr.empty(this.options.quality)&&this.options.quality.length>1;if(Vo.toggleTab.call(this,"quality",i),Vo.checkMenu.call(this),i){ao(n);this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){Vo.createMenuItem.call(t,{value:e,list:n,type:"quality",title:Vo.getLabel.call(t,"quality",e),badge:function(e){var n=No("qualityBadge."+e,t.config);return n.length?Vo.createBadge.call(t,n):null}(e)})}),Vo.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?No("normal",this.config):t+"×";case"quality":if(zr.number(t)){var n=No("qualityLabel."+t,this.config);return n.length?n:t+"p"}return Co(t);case"captions":return Ho.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var i=this.elements.settings.panes[e],r=null,o=t;switch(e){case"captions":r=this.currentTrack;break;default:if(r=zr.empty(n)?this[e]:n,zr.empty(r)&&(r=this.config[e].default),!zr.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '"+r+"' for "+e);if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '"+r+"' for "+e)}if(zr.element(o)||(o=i&&i.querySelector("ul")),zr.element(o)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=Vo.getLabel.call(this,e,r);var a=o&&o.querySelector('input[value="'+r+'"]');zr.element(a)&&(a.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),n=Ho.getTracks.call(this);if(Vo.toggleTab.call(this,"captions",n.length),ao(t),Vo.checkMenu.call(this),n.length){var i=n.map(function(n,i){return{value:i,checked:e.captions.active&&e.currentTrack===i,title:Ho.getLabel.call(e,n),badge:n.language&&Vo.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});i.unshift({value:-1,checked:!this.captions.active,title:No("disabled",this.config),list:t,type:"language"}),i.forEach(Vo.createMenuItem.bind(this)),Vo.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&zr.element(this.elements.settings.panes.speed)){zr.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!zr.empty(this.options.speed)&&this.options.speed.length>1;if(Vo.toggleTab.call(this,"speed",n),Vo.checkMenu.call(this),n){var i=this.elements.settings.panes.speed.querySelector("ul");ao(i),this.options.speed.forEach(function(e){Vo.createMenuItem.call(t,{value:e,list:i,type:"speed",title:Vo.getLabel.call(t,"speed",e)})}),Vo.updateSetting.call(this,"speed",i)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!zr.empty(e)&&Object.values(e).some(function(e){return!e.hidden});co(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(zr.element(t)&&zr.element(n)){var i=zr.boolean(e)?e:zr.element(t)&&t.hasAttribute("hidden");if(zr.event(e)){var r=zr.element(t)&&t.contains(e.target),o=e.target===this.elements.buttons.settings;if(r||!r&&!o&&i)return;o&&e.stopPropagation()}zr.element(n)&&n.setAttribute("aria-expanded",i),zr.element(t)&&(co(t,!i),uo(this.elements.container,this.config.classNames.menu.open,i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return oo(t),{width:n,height:i}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,n=document.getElementById(e);if(zr.element(n)&&"tabpanel"===n.getAttribute("role")){var i=t.querySelector('[role="tabpanel"]:not([hidden])'),r=i.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+i.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),Eo.transitions&&!Eo.reducedMotion){r.style.width=i.scrollWidth+"px",r.style.height=i.scrollHeight+"px";var o=Vo.getTabSize.call(this,n);Yr(r,ko,function e(t){t.target===r&&["width","height"].includes(t.propertyName)&&(r.style.width="",r.style.height="",Qr(r,ko,e))}),r.style.width=o.width+"px",r.style.height=o.height+"px"}co(i,!0),i.setAttribute("tabindex",-1),co(n,!1);var a=po.call(this,'[aria-controls="'+e+'"]');Array.from(a).forEach(function(e){e.setAttribute("aria-expanded",!0)}),n.removeAttribute("tabindex"),n.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(zr.empty(this.config.controls))return null;var n=io("div",lo(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(Vo.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(Vo.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(Vo.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(Vo.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=io("div",lo(this.config.selectors.progress)),r=Vo.createRange.call(this,"seek",{id:"plyr-seek-"+e.id});if(i.appendChild(r.label),i.appendChild(r.input),i.appendChild(Vo.createProgress.call(this,"buffer")),this.config.tooltips.seek){var o=io("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(o),this.elements.display.seekTooltip=o}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(Vo.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(Vo.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(Vo.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a=io("div",{class:"plyr__volume"}),s={max:1,step:.05,value:this.config.volume},l=Vo.createRange.call(this,"volume",Po(s,{id:"plyr-volume-"+e.id}));a.appendChild(l.label),a.appendChild(l.input),this.elements.volume=a,n.appendChild(a)}if(this.config.controls.includes("captions")&&n.appendChild(Vo.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!zr.empty(this.config.settings)){var c=io("div",{class:"plyr__menu",hidden:""});c.appendChild(Vo.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var u=io("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),f=io("div"),h=io("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),d=io("ul",{role:"tablist"});this.config.settings.forEach(function(n){var i=io("li",{role:"tab",hidden:""}),r=io("button",Po(lo(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+n+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+n,"aria-expanded":!1}),No(n,t.config)),o=io("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),d.appendChild(i),t.elements.settings.tabs[n]=i}),h.appendChild(d),f.appendChild(h),this.config.settings.forEach(function(n){var i=io("div",{id:"plyr-settings-"+e.id+"-"+n,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+n+"-tab",role:"tabpanel",tabindex:-1}),r=io("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},No(n,t.config));i.appendChild(r);var o=io("ul");i.appendChild(o),f.appendChild(i),t.elements.settings.panes[n]=i}),u.appendChild(f),c.appendChild(u),n.appendChild(c),this.elements.settings.form=u,this.elements.settings.menu=c}return this.config.controls.includes("pip")&&Eo.pip&&n.appendChild(Vo.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Eo.airplay&&n.appendChild(Vo.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(Vo.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(Vo.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&Vo.setQualityMenu.call(this,Ao.getQualityOptions.call(this)),Vo.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=Vo.getIconUrl.call(this);t.cors&&function(e,t){if(zr.string(e)){var n=zr.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var o=jo.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("cache-"+t);if(null!==s){var l=JSON.parse(s);r(a,l.content)}}fetch(e).then(function(e){zr.empty(e)||(o&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;zr.string(this.config.controls)||zr.element(this.config.controls)?n=this.config.controls:zr.function(this.config.controls)?n=this.config.controls.call(this,i):(n=Vo.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Ho.getLabel.call(this)}),r=!1);var o=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=eo(e,2),i=n[0],r=n[1];t=Lo(t,"{"+i+"}",r)}),t};r&&(zr.string(this.config.controls)?n=o(n):zr.element(n)&&(n.innerHTML=o(n.innerHTML)));var a,s=void 0;if(zr.string(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),zr.element(s)||(s=this.elements.container),zr.element(n)?s.appendChild(n):n&&s.insertAdjacentHTML("beforeend",n),zr.element(this.elements.controls)||Vo.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(a=s,setTimeout(function(){co(a,!0),a.offsetHeight,co(a,!1)},0)),this.config.tooltips.controls){var l=po.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(l).forEach(function(t){uo(t,e.config.classNames.hidden,!1),uo(t,e.config.classNames.tooltip,!0),t.setAttribute("role","tooltip")})}}};function Do(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.statusText)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function Bo(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function Uo(e){if(!zr.object(e))return"";var t=new URLSearchParams;return Object.entries(e).forEach(function(e){var n=eo(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var Ho={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Eo.textTracks)zr.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Vo.setCaptionsMenu.call(this);else{var e,t;if(zr.element(this.elements.captions)||(this.elements.captions=io("div",lo(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),So.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=Bo(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Do(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){oo(e)})})}var i=this.storage.get("captions");zr.boolean(i)||(i=this.config.captions.active);var r=this.storage.get("language")||this.config.captions.language;if("auto"===r){var o=(navigator.language||navigator.userLanguage).split("-");r=eo(o,1)[0]}if(Ho.setLanguage.call(this,r,i),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";Yr(this.media.textTracks,a,Ho.update.bind(this))}setTimeout(Ho.update.bind(this),0)}},update:function(){var e=this,t=Ho.getTracks.call(this,!0),n=this.captions,i=n.language,r=n.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!r.get(e)}).forEach(function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),t.mode="hidden",Yr(t,"cuechange",function(){return Ho.updateCues.call(e)})});var o=!t.find(function(t){return t===e.captions.currentTrackNode}),a=this.language!==i&&t.find(function(e){return e.language===i});(o||a)&&Ho.setLanguage.call(this,i,this.config.captions.active),uo(this.elements.container,this.config.classNames.captions.enabled,!zr.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&Vo.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=Ho.getTracks.call(this);if(-1!==e)if(zr.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=Ho.getCurrentTrack.call(this),o=(r||{}).language;this.captions.currentTrackNode=r,t&&(this.captions.language=o),this.isVimeo&&this.embed.enableTextTrack(o),Jr.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&Ho.updateCues.call(this),n&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(zr.string(e)){this.captions.language=e.toLowerCase();var n=Ho.getTracks.call(this),i=Ho.getCurrentTrack.call(this,!0);Ho.set.call(this,n.indexOf(i),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Ho.getTracks.call(this),i=function(t){return Number((e.captions.meta.get(t)||{}).default)},r=Array.from(n).sort(function(e,t){return i(t)-i(e)});return!t&&n[this.currentTrack]||r.find(function(t){return t.language===e.captions.language})||r[0]},getLabel:function(e){var t=e;return!zr.track(t)&&Eo.textTracks&&this.captions.active&&(t=Ho.getCurrentTrack.call(this)),zr.track(t)?zr.empty(t.label)?zr.empty(t.language)?No("enabled",this.config):e.language.toUpperCase():t.label:No("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(zr.element(this.elements.captions))if(zr.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Ho.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Oo)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){ao(this.elements.captions);var r=io("span",lo(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),Jr.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},Wo={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},zo={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Go={audio:"audio",video:"video"};var Ko=function(){},Yo=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];$r(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return Xr(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Ko}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Ko}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Ko}}]),e}();function Qo(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;zr.element(e)&&yo(e,this.active),Jr.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),So.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(zr.element(e)){var n=po.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1],o=function(e){if("Tab"===e.key&&9===e.keyCode){var t=mo();t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}};t?Yr(this.elements.container,"keydown",o,!1):Qr(this.elements.container,"keydown",o,!1)}}.call(this.player,this.target,this.active)}}function Jo(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",uo(this.target,this.player.config.classNames.fullscreen.fallback,e),Qo.call(this)}var $o=function(){function e(t){var n=this;$r(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},Yr(document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){Qo.call(n)}),Yr(this.player.elements.container,"dblclick",function(e){zr.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return Xr(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),uo(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(So.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?zr.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():Jo.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(So.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!zr.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else Jo.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:fo(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return So.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(zr.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!zr.function(document[t+"ExitFullscreen"])&&!zr.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function Xo(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,o=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:o,onerror:o,src:e})})}var Zo={addStyleHook:function(){uo(this.elements.container,this.config.selectors.container.replace(".",""),!0),uo(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void Zo.toggleNativeControls.call(this,!0);zr.element(this.elements.controls)||(Vo.inject.call(this),this.listeners.controls()),Zo.toggleNativeControls.call(this),this.isHTML5&&Ho.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,Vo.updateVolume.call(this),Vo.timeUpdate.call(this),Zo.checkPlaying.call(this),uo(this.elements.container,this.config.classNames.pip.supported,Eo.pip&&this.isHTML5&&this.isVideo),uo(this.elements.container,this.config.classNames.airplay.supported,Eo.airplay&&this.isHTML5),uo(this.elements.container,this.config.classNames.isIos,So.isIos),uo(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){Jr.call(e,e.media,"ready")},0),Zo.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&Zo.setPoster.call(this,this.poster),this.config.duration&&Vo.durationUpdate.call(this)},setTitle:function(){var e=No("play",this.config);if(zr.string(this.config.title)&&!zr.empty(this.config.title)&&(e+=", "+this.config.title,this.elements.container.setAttribute("aria-label",this.config.title)),zr.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=go.call(this,"iframe");if(!zr.element(t))return;var n=zr.empty(this.config.title)?"video":this.config.title,i=No("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){uo(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!zr.element(this.elements.poster))return Promise.reject();var n=Xo(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),Zo.togglePoster.call(t,!0),e});return n.catch(function(){return Zo.togglePoster.call(t,!1)}),n},checkPlaying:function(e){uo(this.elements.container,this.config.classNames.playing,this.playing),uo(this.elements.container,this.config.classNames.paused,this.paused),uo(this.elements.container,this.config.classNames.stopped,this.stopped),yo(this.elements.buttons.play,this.playing),zr.event(e)&&"timeupdate"===e.type||Zo.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){uo(t.elements.container,t.config.classNames.loading,t.loading),Zo.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},ea=function(){function e(t){$r(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return Xr(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,r=i&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&zr.number(n)){if(i){var o=mo();if(zr.element(o)&&o!==this.player.elements.inputs.seek&&ho(o,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:r||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:r||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:r||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:r||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){Vo.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,uo(this.player.elements.container,this.player.config.classNames.isTouch,!0),Qr(document.body,"touchstart",this.firstTouch)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&Kr(window,"keydown keyup",this.handleKey,e,!1),Kr(document.body,"click",this.toggleMenu,e),Yr(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&Yr(this.player.elements.container,"keydown keyup",this.handleKey,!1),Yr(this.player.elements.container,"focusout",function(t){uo(t.target,e.player.config.classNames.tabFocus,!1)}),Yr(this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){uo(mo(),e.player.config.classNames.tabFocus,!0)},0)}),Yr(this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var n=e.player.elements.controls;"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var i=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(Zo.toggleControls.call(e.player,!0),i=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return Zo.toggleControls.call(e.player,!1)},i)})}},{key:"media",value:function(){var e=this;if(Yr(this.player.media,"timeupdate seeking seeked",function(t){return Vo.timeUpdate.call(e.player,t)}),Yr(this.player.media,"durationchange loadeddata loadedmetadata",function(t){return Vo.durationUpdate.call(e.player,t)}),Yr(this.player.media,"loadeddata canplay",function(){co(e.player.elements.volume,!e.player.hasAudio),co(e.player.elements.buttons.mute,!e.player.hasAudio)}),Yr(this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),Yr(this.player.media,"progress playing seeking seeked",function(t){return Vo.updateProgress.call(e.player,t)}),Yr(this.player.media,"volumechange",function(t){return Vo.updateVolume.call(e.player,t)}),Yr(this.player.media,"playing play pause ended emptied timeupdate",function(t){return Zo.checkPlaying.call(e.player,t)}),Yr(this.player.media,"waiting canplay seeked playing",function(t){return Zo.checkLoading.call(e.player,t)}),Yr(this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=go.call(this.player,"."+this.player.config.classNames.video);if(!zr.element(t))return;Yr(t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&Yr(this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Yr(this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),Yr(this.player.media,"ratechange",function(){Vo.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),Yr(this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),Yr(this.player.media,"qualitychange",function(t){Vo.updateSetting.call(e.player,"quality",null,t.detail.quality)}),Yr(this.player.media,"languagechange",function(){Vo.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),Yr(this.player.media,"captionsenabled captionsdisabled",function(){Vo.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),Yr(this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var n=t.detail,i=void 0===n?{}:n;"error"===t.type&&(i=e.player.media.error),Jr.call(e.player,e.player.elements.container,t.type,!0,i)})}},{key:"controls",value:function(){var e=this,t=So.isIE?"change":"input",n=function(t,n,i){var r=e.player.config.listeners[i],o=!0;zr.function(r)&&(o=r.call(e.player,t)),o&&zr.function(n)&&n.call(e.player,t)},i=function(t,i,r,o){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=e.player.config.listeners[o],l=zr.function(s);Yr(t,i,function(e){return n(e,r,o)},a&&!l)};i(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),i(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),i(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),i(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),i(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),i(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),i(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),i(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),i(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),i(this.player.elements.buttons.settings,"click",function(t){Vo.toggleMenu.call(e.player,t)}),i(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";Vo.showTab.call(e.player,t)};if(ho(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(ho(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(ho(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var r=t.target;Vo.showTab.call(e.player,r.getAttribute("aria-controls"))}}),i(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var n=e.player.elements.progress.getBoundingClientRect(),i=100/n.width*(t.pageX-n.left);t.currentTarget.setAttribute("seek-value",i)}),i(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r=t.type;if("keydown"!==r&&"keyup"!==r||39===i||37===i){var o=n.hasAttribute("play-on-seeked"),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute("play-on-seeked"),e.player.play()):!a&&e.player.playing&&(n.setAttribute("play-on-seeked",""),e.player.pause())}}),i(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");zr.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),e.player.currentTime=i/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!zr.element(this.player.elements.display.duration)&&i(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,Vo.timeUpdate.call(e.player))}),i(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),So.isWebkit&&i(po.call(this.player,'input[type="range"]'),"input",function(t){Vo.updateRangeFill.call(e.player,t.target)}),i(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return Vo.updateSeekTooltip.call(e.player,t)}),i(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),i(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),i(this.player.elements.controls,"focusin focusout",function(t){var n=e.player,i=n.config,r=n.elements,o=n.timers;if(uo(r.controls,i.classNames.noTransition,"focusin"===t.type),Zo.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){uo(r.controls,i.classNames.noTransition,!1)},0);var a=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return Zo.toggleControls.call(e.player,!1)},a)}}),i(this.player.elements.inputs.volume,"wheel",function(t){var n=t.webkitDirectionInvertedFromDevice,i=0;(t.deltaY<0||t.deltaX>0)&&(n?(e.player.decreaseVolume(.02),i=-1):(e.player.increaseVolume(.02),i=1)),(t.deltaY>0||t.deltaX<0)&&(n?(e.player.increaseVolume(.02),i=1):(e.player.decreaseVolume(.02),i=-1)),(1===i&&e.player.media.volume<1||-1===i&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}},{key:"clear",value:function(){this.global(!1)}}]),e}(),ta=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function a(t,n,i,r){var o,s,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(o=!0,(s=l.createElement("link")).rel="stylesheet",s.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=h:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(o&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return a(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==f(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,o=(e=e.push?e:[e]).length,s=o,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--o||t(l)},r=0;r<s;r++)a(e[r],i,n)}(e,function(e){o(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,o,a,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?r(o,a):(i[o]=i[o]||[]).push(r)}(e,function(e){o(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()});function na(e){return new Promise(function(t,n){ta(e,{success:t,error:n})})}function ia(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Jr.call(this,this.media,e?"play":"pause"))}var ra={setup:function(){var e=this;uo(this.elements.wrapper,this.config.classNames.embed,!0),ra.setAspectRatio.call(this),zr.object(window.Vimeo)?ra.ready.call(this):na(this.config.urls.vimeo.sdk).then(function(){ra.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=zr.string(e)?e.split(":"):this.config.ratio.split(":"),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-"+i+"%)"}},ready:function(){var e=this,t=this,n=Uo({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");zr.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,zr.empty(r)?null:zr.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=io("iframe"),s=Mo(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=io("div",{class:t.config.classNames.embedContainer});l.appendChild(a),t.media=so(l,t.media),Do(Mo(t.config.urls.vimeo.api,o),"json").then(function(e){if(!zr.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",Zo.setPoster.call(t,n.href)}}),t.embed=new window.Vimeo.Player(a,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return ia.call(t,!0),t.embed.play()},t.media.pause=function(){return ia.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,Jr.call(t,i,"seeking"),Promise.resolve(a&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return a&&n.pause()}).then(function(){return a&&n.setVolume(o)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,Jr.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&Vo.setSpeedMenu.call(t,[])})}});var f=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return f},set:function(e){t.embed.setVolume(e).then(function(){f=e,Jr.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!zr.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,Jr.call(t,t.media,"volumechange")})}});var d=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return d},set:function(e){var n=zr.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){d=n})}});var p=void 0;t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return e/n+":"+t/n}(t[0],t[1]);ra.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,Zo.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,Jr.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,Jr.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Ho.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Ho.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){ia.call(t,!e),e||Jr.call(t,t.media,"playing")}),zr.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){ia.call(t,!0),Jr.call(t,t.media,"playing")}),t.embed.on("pause",function(){ia.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,Jr.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,Jr.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&Jr.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,Jr.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,Jr.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,Jr.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,Jr.call(t,t.media,"error")}),setTimeout(function(){return Zo.build.call(t)},0)}};function oa(e){switch(e){case"hd2160":return 2160;case 2160:return"hd2160";case"hd1440":return 1440;case 1440:return"hd1440";case"hd1080":return 1080;case 1080:return"hd1080";case"hd720":return 720;case 720:return"hd720";case"large":return 480;case 480:return"large";case"medium":return 360;case 360:return"medium";case"small":return 240;case 240:return"small";default:return"default"}}function aa(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Jr.call(this,this.media,e?"play":"pause"))}var sa,la={setup:function(){var e=this;uo(this.elements.wrapper,this.config.classNames.embed,!0),la.setAspectRatio.call(this),zr.object(window.YT)&&zr.function(window.YT.Player)?la.ready.call(this):(na(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){la.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(zr.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(zr.empty(n))return this.config.title=n,void Zo.setTitle.call(this)}var i=this.config.keys.google;zr.string(i)&&!zr.empty(i)&&Do(Mo(this.config.urls.youtube.api,e,i)).then(function(e){zr.object(e)&&(t.config.title=e.items[0].snippet.title,Zo.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(zr.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");zr.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r=(i=n,zr.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=e.provider+"-"+Math.floor(1e4*Math.random()),a=io("div",{id:o});e.media=so(a,e.media);var s=function(e){return"https://img.youtube.com/vi/"+r+"/"+e+"default.jpg"};Xo(s("maxres"),121).catch(function(){return Xo(s("sd"),121)}).catch(function(){return Xo(s("hq"))}).then(function(t){return Zo.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(o,{videoId:r,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!zr.object(e.media.error)){var n={code:t.data};switch(t.data){case 2:n.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:n.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:n.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:n.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:n.message="An unknown error occured"}e.media.error=n,Jr.call(e,e.media,"error")}},onPlaybackQualityChange:function(){Jr.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),Jr.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;la.getTitle.call(e,r),e.media.play=function(){aa.call(e,!0),n.playVideo()},e.media.pause=function(){aa.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,Jr.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return oa(n.getPlaybackQuality())},set:function(t){var i=t;n.setPlaybackQuality(oa(i)),Jr.call(e,e.media,"qualityrequested",!1,{quality:i})}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),Jr.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var i=zr.boolean(t)?t:o;o=i,n[i?"mute":"unMute"](),Jr.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),Jr.call(e,e.media,"timeupdate"),Jr.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&Jr.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),Jr.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return Zo.build.call(e)},50)},onStateChange:function(t){var n,i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,Jr.call(e,e.media,"seeked")),t.data){case-1:Jr.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),Jr.call(e,e.media,"progress");break;case 0:aa.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):Jr.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(aa.call(e,!0),Jr.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){Jr.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),Jr.call(e,e.media,"durationchange")),Vo.setQualityMenu.call(e,(n=i.getAvailableQualityLevels(),zr.empty(n)?n:_o(n.map(function(e){return oa(e)})))));break;case 2:e.muted||e.embed.unMute(),aa.call(e,!1)}Jr.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},ca={setup:function(){if(this.media)if(uo(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),uo(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&uo(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=io("div",{class:this.config.classNames.video}),to(this.media,this.elements.wrapper),this.elements.poster=io("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":la.setup.call(this);break;case"vimeo":ra.setup.call(this)}else this.isHTML5&&Ao.extend.call(this);else this.debug.warn("No media element found!")}},ua=function(){function e(t){var n=this;$r(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return Xr(e,[{key:"load",value:function(){var e=this;this.enabled&&(zr.object(window.google)&&zr.object(window.google.ima)?this.ready():na(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=io("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=qo(Math.max(e.manager.getRemainingTime(),0)),n=No("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),zr.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(zr.element(n)){var i=100/t.player.duration*e,r=io("span",{class:t.player.config.classNames.cues});r.style.left=i.toString()+"%",n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads"+e.replace(/_/g,"").toLowerCase();Jr.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;zr.empty(e.cuePoints)||e.cuePoints.forEach(function(i,r){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];zr.array(o)&&o.forEach(function(e){zr.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return zr.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){zr.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!zr.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+Uo({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),fa={insertElements:function(e,t){var n=this;zr.string(t)?ro(e,this.media,{src:t}):zr.array(t)&&t.forEach(function(t){ro(e,n.media,t)})},change:function(e){var t=this;zr.object(e)&&"sources"in e&&e.sources.length?(Ao.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],oo(t.media),t.media=null,zr.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=zr.empty(e.sources[0].provider)?zo.html5:e.sources[0].provider,t.supported=Eo.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=io("video");break;case"html5:audio":t.media=io("audio");break;case"youtube:video":case"vimeo:video":t.media=io("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),zr.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),zr.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),Zo.addStyleHook.call(t),t.isHTML5&&fa.insertElements.call(t,"source",e.sources),t.config.title=e.title,ca.setup.call(t),t.isHTML5&&("tracks"in e&&fa.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&Zo.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},ha=function(){function e(t,n){var i=this;if($r(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Eo.touch,this.media=t,zr.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||zr.nodeList(this.media)||zr.array(this.media))&&(this.media=this.media[0]),this.config=Po({},Wo,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Yo(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Eo),!zr.nullOrUndefined(this.media)&&zr.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Eo.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),zr.element(a)){if(s=Bo(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?zo.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?zo.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",!s.searchParams){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=l.includes(s.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(zr.empty(this.provider)||!Object.keys(zo).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Go.video;break;case"video":case"audio":this.type=o,this.provider=zo.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=Eo.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.listeners=new ea(this),this.storage=new jo(this),this.media.plyr=this,zr.element(this.elements.container)||(this.elements.container=io("div"),to(this.media,this.elements.container)),this.elements.container.setAttribute("tabindex",0),Zo.addStyleHook.call(this),ca.setup.call(this),this.config.debug&&Yr(this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Zo.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new $o(this),this.ads=new ua(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return Xr(e,[{key:"play",value:function(){return zr.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&zr.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(zr.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):zr.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(zr.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(zr.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(zr.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(zr.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=zr.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);yo(this.elements.buttons.captions,t),uo(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,Jr.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){Eo.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=fo(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=uo(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!zr.empty(this.config.settings)&&Vo.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";Jr.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Yr(this.elements.container,e,t)}},{key:"off",value:function(e,t){Qr(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(oo(t.elements.buttons.play),oo(t.elements.captions),oo(t.elements.controls),oo(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),zr.function(e)&&e()):(t.listeners.clear(),so(t.elements.original,t.elements.container),Jr.call(t,t.elements.original,"destroyed",!0),zr.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),Zo.toggleNativeControls.call(this,!0),i();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&zr.function(this.embed.destroy)&&this.embed.destroy(),i();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200)}}}},{key:"supports",value:function(e){return Eo.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===zo.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===zo.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===zo.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Go.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Go.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=zr.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return zr.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;zr.string(t)&&(t=Number(t)),zr.number(t)||(t=this.storage.get("volume")),zr.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!zr.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;zr.boolean(t)||(t=this.storage.get("muted")),zr.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;zr.number(e)&&(t=e),zr.number(t)||(t=this.storage.get("speed")),zr.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=null;if(zr.empty(e)||(t=Number(e)),zr.number(t)||(t=this.storage.get("quality")),zr.number(t)||(t=this.config.quality.selected),zr.number(t)||(t=this.config.quality.default),this.options.quality.length){if(!this.options.quality.includes(t)){var n=function(e,t){return zr.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(this.options.quality,t);this.debug.warn("Unsupported quality option: "+t+", using "+n+" instead"),t=n}this.config.quality.selected=t,this.media.quality=t}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=zr.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){fa.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?Zo.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=zr.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Ho.set.call(this,e)},get:function(){var e=this.captions,t=e.active,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Ho.setLanguage.call(this,e)},get:function(){return(Ho.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Eo.pip){var i=zr.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Eo.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Eo.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return na(e)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return zr.string(t)?i=Array.from(document.querySelectorAll(t)):zr.nodeList(t)?i=Array.from(t):zr.array(t)&&(i=t.filter(zr.element)),zr.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return ha.defaults=(sa=Wo,JSON.parse(JSON.stringify(sa))),ha}); +"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):e.Plyr=t()}(this,function(){"use strict";var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=t(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=t(function(e){var t=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=t)}),r=(i.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),a=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e},o=function(e){try{return!!e()}catch(e){return!0}},s=!o(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),l=n.document,c=r(l)&&r(l.createElement),u=function(e){return c?l.createElement(e):{}},f=!s&&!o(function(){return 7!=Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a}),h=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},d=Object.defineProperty,p={f:s?Object.defineProperty:function(e,t,n){if(a(e),t=h(t,!0),a(n),f)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},g=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},m=s?function(e,t,n){return p.f(e,t,g(1,n))}:function(e,t,n){return e[t]=n,e},y={}.hasOwnProperty,v=function(e,t){return y.call(e,t)},b=0,w=Math.random(),k=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},T=t(function(e){var t=k("src"),r=Function.toString,a=(""+r).split("toString");i.inspectSource=function(e){return r.call(e)},(e.exports=function(e,i,r,o){var s="function"==typeof r;s&&(v(r,"name")||m(r,"name",i)),e[i]!==r&&(s&&(v(r,t)||m(r,t,e[i]?""+e[i]:a.join(String(i)))),e===n?e[i]=r:o?e[i]?e[i]=r:m(e,i,r):(delete e[i],m(e,i,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||r.call(this)})}),S=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(e,t,n){if(S(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},_=function(e,t,r){var a,o,s,l,c=e&_.F,u=e&_.G,f=e&_.S,h=e&_.P,d=e&_.B,p=u?n:f?n[t]||(n[t]={}):(n[t]||{}).prototype,g=u?i:i[t]||(i[t]={}),y=g.prototype||(g.prototype={});for(a in u&&(r=t),r)s=((o=!c&&p&&void 0!==p[a])?p:r)[a],l=d&&o?E(s,n):h&&"function"==typeof s?E(Function.call,s):s,p&&T(p,a,s,e&_.U),g[a]!=s&&m(g,a,l),h&&y[a]!=s&&(y[a]=s)};n.core=i,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;for(var A,P=_,M=k("typed_array"),L=k("view"),C=!(!n.ArrayBuffer||!n.DataView),x=C,O=0,N="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");O<9;)(A=n[N[O++]])?(m(A.prototype,M,!0),m(A.prototype,L,!0)):x=!1;var j={ABV:C,CONSTR:x,TYPED:M,VIEW:L},I=function(e,t,n){for(var i in t)T(e,i,t[i],n);return e},F=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},R=Math.ceil,q=Math.floor,V=function(e){return isNaN(e=+e)?0:(e>0?q:R)(e)},B=Math.min,D=function(e){return e>0?B(V(e),9007199254740991):0},U=function(e){if(void 0===e)return 0;var t=V(e),n=D(t);if(t!==n)throw RangeError("Wrong length!");return n},H={}.toString,W=function(e){return H.call(e).slice(8,-1)},z=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==W(e)?e.split(""):Object(e)},G=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},K=function(e){return z(G(e))},Y=Math.max,Q=Math.min,J=function(e,t){return(e=V(e))<0?Y(e+t,0):Q(e,t)},$=function(e){return function(t,n,i){var r,a=K(t),o=D(a.length),s=J(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},X=n["__core-js_shared__"]||(n["__core-js_shared__"]={}),Z=function(e){return X[e]||(X[e]={})},ee=Z("keys"),te=function(e){return ee[e]||(ee[e]=k(e))},ne=$(!1),ie=te("IE_PROTO"),re=function(e,t){var n,i=K(e),r=0,a=[];for(n in i)n!=ie&&v(i,n)&&a.push(n);for(;t.length>r;)v(i,n=t[r++])&&(~ne(a,n)||a.push(n));return a},ae="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),oe=ae.concat("length","prototype"),se={f:Object.getOwnPropertyNames||function(e){return re(e,oe)}},le=function(e){return Object(G(e))},ce=function(e){for(var t=le(this),n=D(t.length),i=arguments.length,r=J(i>1?arguments[1]:void 0,n),a=i>2?arguments[2]:void 0,o=void 0===a?n:J(a,n);o>r;)t[r++]=e;return t},ue=t(function(e){var t=Z("wks"),i=n.Symbol,r="function"==typeof i;(e.exports=function(e){return t[e]||(t[e]=r&&i[e]||(r?i:k)("Symbol."+e))}).store=t}),fe=p.f,he=ue("toStringTag"),de=function(e,t,n){e&&!v(e=n?e:e.prototype,he)&&fe(e,he,{configurable:!0,value:t})},pe=t(function(e,t){var i=se.f,r=p.f,a="prototype",l="Wrong index!",c=n.ArrayBuffer,u=n.DataView,f=n.Math,h=n.RangeError,d=n.Infinity,g=c,y=f.abs,v=f.pow,b=f.floor,w=f.log,k=f.LN2,T=s?"_b":"buffer",S=s?"_l":"byteLength",E=s?"_o":"byteOffset";function _(e,t,n){var i,r,a,o=new Array(n),s=8*n-t-1,l=(1<<s)-1,c=l>>1,u=23===t?v(2,-24)-v(2,-77):0,f=0,h=e<0||0===e&&1/e<0?1:0;for((e=y(e))!=e||e===d?(r=e!=e?1:0,i=l):(i=b(w(e)/k),e*(a=v(2,-i))<1&&(i--,a*=2),(e+=i+c>=1?u/a:u*v(2,1-c))*a>=2&&(i++,a/=2),i+c>=l?(r=0,i=l):i+c>=1?(r=(e*a-1)*v(2,t),i+=c):(r=e*v(2,c-1)*v(2,t),i=0));t>=8;o[f++]=255&r,r/=256,t-=8);for(i=i<<t|r,s+=t;s>0;o[f++]=255&i,i/=256,s-=8);return o[--f]|=128*h,o}function A(e,t,n){var i,r=8*n-t-1,a=(1<<r)-1,o=a>>1,s=r-7,l=n-1,c=e[l--],u=127&c;for(c>>=7;s>0;u=256*u+e[l],l--,s-=8);for(i=u&(1<<-s)-1,u>>=-s,s+=t;s>0;i=256*i+e[l],l--,s-=8);if(0===u)u=1-o;else{if(u===a)return i?NaN:c?-d:d;i+=v(2,t),u-=o}return(c?-1:1)*i*v(2,u-t)}function P(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function M(e){return[255&e]}function L(e){return[255&e,e>>8&255]}function C(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function x(e){return _(e,52,8)}function O(e){return _(e,23,4)}function N(e,t,n){r(e[a],t,{get:function(){return this[n]}})}function R(e,t,n,i){var r=U(+n);if(r+t>e[S])throw h(l);var a=e[T]._b,o=r+e[E],s=a.slice(o,o+t);return i?s:s.reverse()}function q(e,t,n,i,r,a){var o=U(+n);if(o+t>e[S])throw h(l);for(var s=e[T]._b,c=o+e[E],u=i(+r),f=0;f<t;f++)s[c+f]=u[a?f:t-f-1]}if(j.ABV){if(!o(function(){c(1)})||!o(function(){new c(-1)})||o(function(){return new c,new c(1.5),new c(NaN),"ArrayBuffer"!=c.name})){for(var B,H=(c=function(e){return F(this,c),new g(U(e))})[a]=g[a],W=i(g),z=0;W.length>z;)(B=W[z++])in c||m(c,B,g[B]);H.constructor=c}var G=new u(new c(2)),K=u[a].setInt8;G.setInt8(0,2147483648),G.setInt8(1,2147483649),!G.getInt8(0)&&G.getInt8(1)||I(u[a],{setInt8:function(e,t){K.call(this,e,t<<24>>24)},setUint8:function(e,t){K.call(this,e,t<<24>>24)}},!0)}else c=function(e){F(this,c,"ArrayBuffer");var t=U(e);this._b=ce.call(new Array(t),0),this[S]=t},u=function(e,t,n){F(this,u,"DataView"),F(e,c,"DataView");var i=e[S],r=V(t);if(r<0||r>i)throw h("Wrong offset!");if(r+(n=void 0===n?i-r:D(n))>i)throw h("Wrong length!");this[T]=e,this[E]=r,this[S]=n},s&&(N(c,"byteLength","_l"),N(u,"buffer","_b"),N(u,"byteLength","_l"),N(u,"byteOffset","_o")),I(u[a],{getInt8:function(e){return R(this,1,e)[0]<<24>>24},getUint8:function(e){return R(this,1,e)[0]},getInt16:function(e){var t=R(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=R(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return P(R(this,4,e,arguments[1]))},getUint32:function(e){return P(R(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return A(R(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return A(R(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,M,t)},setUint8:function(e,t){q(this,1,e,M,t)},setInt16:function(e,t){q(this,2,e,L,t,arguments[2])},setUint16:function(e,t){q(this,2,e,L,t,arguments[2])},setInt32:function(e,t){q(this,4,e,C,t,arguments[2])},setUint32:function(e,t){q(this,4,e,C,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,O,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,x,t,arguments[2])}});de(c,"ArrayBuffer"),de(u,"DataView"),m(u[a],j.VIEW,!0),t.ArrayBuffer=c,t.DataView=u}),ge=ue("species"),me=function(e,t){var n,i=a(e).constructor;return void 0===i||null==(n=a(i)[ge])?t:S(n)},ye=ue("species"),ve=function(e){var t=n[e];s&&t&&!t[ye]&&p.f(t,ye,{configurable:!0,get:function(){return this}})},be=n.ArrayBuffer,we=pe.ArrayBuffer,ke=pe.DataView,Te=j.ABV&&be.isView,Se=we.prototype.slice,Ee=j.VIEW;P(P.G+P.W+P.F*(be!==we),{ArrayBuffer:we}),P(P.S+P.F*!j.CONSTR,"ArrayBuffer",{isView:function(e){return Te&&Te(e)||r(e)&&Ee in e}}),P(P.P+P.U+P.F*o(function(){return!new we(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==Se&&void 0===t)return Se.call(a(this),e);for(var n=a(this).byteLength,i=J(e,n),r=J(void 0===t?n:t,n),o=new(me(this,we))(D(r-i)),s=new ke(this),l=new ke(o),c=0;i<r;)l.setUint8(c++,s.getUint8(i++));return o}}),ve("ArrayBuffer");var _e=ue("toStringTag"),Ae="Arguments"==W(function(){return arguments}()),Pe=function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),_e))?n:Ae?W(t):"Object"==(i=W(t))&&"function"==typeof t.callee?"Arguments":i},Me={},Le=ue("iterator"),Ce=Array.prototype,xe=function(e){return void 0!==e&&(Me.Array===e||Ce[Le]===e)},Oe=Object.keys||function(e){return re(e,ae)},Ne=s?Object.defineProperties:function(e,t){a(e);for(var n,i=Oe(t),r=i.length,o=0;r>o;)p.f(e,n=i[o++],t[n]);return e},je=n.document,Ie=je&&je.documentElement,Fe=te("IE_PROTO"),Re=function(){},qe=function(){var e,t=u("iframe"),n=ae.length;for(t.style.display="none",Ie.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),qe=e.F;n--;)delete qe.prototype[ae[n]];return qe()},Ve=Object.create||function(e,t){var n;return null!==e?(Re.prototype=a(e),n=new Re,Re.prototype=null,n[Fe]=e):n=qe(),void 0===t?n:Ne(n,t)},Be=te("IE_PROTO"),De=Object.prototype,Ue=Object.getPrototypeOf||function(e){return e=le(e),v(e,Be)?e[Be]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?De:null},He=ue("iterator"),We=i.getIteratorMethod=function(e){if(null!=e)return e[He]||e["@@iterator"]||Me[Pe(e)]},ze=Array.isArray||function(e){return"Array"==W(e)},Ge=ue("species"),Ke=function(e,t){return new(function(e){var t;return ze(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!ze(t.prototype)||(t=void 0),r(t)&&null===(t=t[Ge])&&(t=void 0)),void 0===t?Array:t}(e))(t)},Ye=function(e,t){var n=1==e,i=2==e,r=3==e,a=4==e,o=6==e,s=5==e||o,l=t||Ke;return function(t,c,u){for(var f,h,d=le(t),p=z(d),g=E(c,u,3),m=D(p.length),y=0,v=n?l(t,m):i?l(t,0):void 0;m>y;y++)if((s||y in p)&&(h=g(f=p[y],y,d),e))if(n)v[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:v.push(f)}else if(a)return!1;return o?-1:r||a?a:v}},Qe=ue("unscopables"),Je=Array.prototype;null==Je[Qe]&&m(Je,Qe,{});var $e=function(e){Je[Qe][e]=!0},Xe=function(e,t){return{value:t,done:!!e}},Ze={};m(Ze,ue("iterator"),function(){return this});var et=function(e,t,n){e.prototype=Ve(Ze,{next:g(1,n)}),de(e,t+" Iterator")},tt=ue("iterator"),nt=!([].keys&&"next"in[].keys()),it=function(){return this},rt=function(e,t,n,i,r,a,o){et(n,t,i);var s,l,c,u=function(e){if(!nt&&e in p)return p[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",h="values"==r,d=!1,p=e.prototype,g=p[tt]||p["@@iterator"]||r&&p[r],y=!nt&&g||u(r),b=r?h?u("entries"):y:void 0,w="Array"==t&&p.entries||g;if(w&&(c=Ue(w.call(new e)))!==Object.prototype&&c.next&&(de(c,f,!0),v(c,tt)||m(c,tt,it)),h&&g&&"values"!==g.name&&(d=!0,y=function(){return g.call(this)}),(nt||d||!p[tt])&&m(p,tt,y),Me[t]=y,Me[f]=it,r)if(s={values:h?y:u("values"),keys:a?y:u("keys"),entries:b},o)for(l in s)l in p||T(p,l,s[l]);else P(P.P+P.F*(nt||d),t,s);return s},at=rt(Array,"Array",function(e,t){this._t=K(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Xe(1)):Xe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Me.Arguments=Me.Array,$e("keys"),$e("values"),$e("entries");var ot=ue("iterator"),st=!1;try{[7][ot]().return=function(){st=!0}}catch(e){}var lt=function(e,t){if(!t&&!st)return!1;var n=!1;try{var i=[7],r=i[ot]();r.next=function(){return{done:n=!0}},i[ot]=function(){return r},e(i)}catch(e){}return n},ct=[].copyWithin||function(e,t){var n=le(this),i=D(n.length),r=J(e,i),a=J(t,i),o=arguments.length>2?arguments[2]:void 0,s=Math.min((void 0===o?i:J(o,i))-a,i-r),l=1;for(a<r&&r<a+s&&(l=-1,a+=s-1,r+=s-1);s-- >0;)a in n?n[r]=n[a]:delete n[r],r+=l,a+=l;return n},ut={f:{}.propertyIsEnumerable},ft=Object.getOwnPropertyDescriptor,ht={f:s?ft:function(e,t){if(e=K(e),t=h(t,!0),f)try{return ft(e,t)}catch(e){}if(v(e,t))return g(!ut.f.call(e,t),e[t])}},dt=t(function(e){if(s){var t=n,i=o,a=P,l=j,c=pe,u=E,f=F,d=g,y=m,b=I,w=V,T=D,S=U,_=J,A=h,M=v,L=Pe,C=r,x=le,O=xe,N=Ve,R=Ue,q=se.f,B=We,H=k,W=ue,z=Ye,G=$,K=me,Y=at,Q=Me,X=lt,Z=ve,ee=ce,te=ct,ne=p,ie=ht,re=ne.f,ae=ie.f,oe=t.RangeError,fe=t.TypeError,he=t.Uint8Array,de=Array.prototype,ge=c.ArrayBuffer,ye=c.DataView,be=z(0),we=z(2),ke=z(3),Te=z(4),Se=z(5),Ee=z(6),_e=G(!0),Ae=G(!1),Le=Y.values,Ce=Y.keys,Oe=Y.entries,Ne=de.lastIndexOf,je=de.reduce,Ie=de.reduceRight,Fe=de.join,Re=de.sort,qe=de.slice,Be=de.toString,De=de.toLocaleString,He=W("iterator"),ze=W("toStringTag"),Ge=H("typed_constructor"),Ke=H("def_constructor"),Qe=l.CONSTR,Je=l.TYPED,$e=l.VIEW,Xe=z(1,function(e,t){return it(K(e,e[Ke]),t)}),Ze=i(function(){return 1===new he(new Uint16Array([1]).buffer)[0]}),et=!!he&&!!he.prototype.set&&i(function(){new he(1).set({})}),tt=function(e,t){var n=w(e);if(n<0||n%t)throw oe("Wrong offset!");return n},nt=function(e){if(C(e)&&Je in e)return e;throw fe(e+" is not a typed array!")},it=function(e,t){if(!(C(e)&&Ge in e))throw fe("It is not a typed array constructor!");return new e(t)},rt=function(e,t){return ot(K(e,e[Ke]),t)},ot=function(e,t){for(var n=0,i=t.length,r=it(e,i);i>n;)r[n]=t[n++];return r},st=function(e,t,n){re(e,t,{get:function(){return this._d[n]}})},ut=function(e){var t,n,i,r,a,o,s=x(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,h=B(s);if(null!=h&&!O(h)){for(o=h.call(s),i=[],t=0;!(a=o.next()).done;t++)i.push(a.value);s=i}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=T(s.length),r=it(this,n);n>t;t++)r[t]=f?c(s[t],t):s[t];return r},ft=function(){for(var e=0,t=arguments.length,n=it(this,t);t>e;)n[e]=arguments[e++];return n},dt=!!he&&i(function(){De.call(new he(1))}),pt=function(){return De.apply(dt?qe.call(nt(this)):nt(this),arguments)},gt={copyWithin:function(e,t){return te.call(nt(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Te(nt(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return ee.apply(nt(this),arguments)},filter:function(e){return rt(this,we(nt(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Se(nt(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return Ee(nt(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){be(nt(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return Ae(nt(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return _e(nt(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return Fe.apply(nt(this),arguments)},lastIndexOf:function(e){return Ne.apply(nt(this),arguments)},map:function(e){return Xe(nt(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return je.apply(nt(this),arguments)},reduceRight:function(e){return Ie.apply(nt(this),arguments)},reverse:function(){for(var e,t=nt(this).length,n=Math.floor(t/2),i=0;i<n;)e=this[i],this[i++]=this[--t],this[t]=e;return this},some:function(e){return ke(nt(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return Re.call(nt(this),e)},subarray:function(e,t){var n=nt(this),i=n.length,r=_(e,i);return new(K(n,n[Ke]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,T((void 0===t?i:_(t,i))-r))}},mt=function(e,t){return rt(this,qe.call(nt(this),e,t))},yt=function(e){nt(this);var t=tt(arguments[1],1),n=this.length,i=x(e),r=T(i.length),a=0;if(r+t>n)throw oe("Wrong length!");for(;a<r;)this[t+a]=i[a++]},vt={entries:function(){return Oe.call(nt(this))},keys:function(){return Ce.call(nt(this))},values:function(){return Le.call(nt(this))}},bt=function(e,t){return C(e)&&e[Je]&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},wt=function(e,t){return bt(e,t=A(t,!0))?d(2,e[t]):ae(e,t)},kt=function(e,t,n){return!(bt(e,t=A(t,!0))&&C(n)&&M(n,"value"))||M(n,"get")||M(n,"set")||n.configurable||M(n,"writable")&&!n.writable||M(n,"enumerable")&&!n.enumerable?re(e,t,n):(e[t]=n.value,e)};Qe||(ie.f=wt,ne.f=kt),a(a.S+a.F*!Qe,"Object",{getOwnPropertyDescriptor:wt,defineProperty:kt}),i(function(){Be.call({})})&&(Be=De=function(){return Fe.call(this)});var Tt=b({},gt);b(Tt,vt),y(Tt,He,vt.values),b(Tt,{slice:mt,set:yt,constructor:function(){},toString:Be,toLocaleString:pt}),st(Tt,"buffer","b"),st(Tt,"byteOffset","o"),st(Tt,"byteLength","l"),st(Tt,"length","e"),re(Tt,ze,{get:function(){return this[Je]}}),e.exports=function(e,n,r,o){var s=e+((o=!!o)?"Clamped":"")+"Array",c="get"+e,u="set"+e,h=t[s],d=h||{},p=h&&R(h),g=!h||!l.ABV,m={},v=h&&h.prototype,b=function(e,t){re(e,t,{get:function(){return function(e,t){var i=e._d;return i.v[c](t*n+i.o,Ze)}(this,t)},set:function(e){return function(e,t,i){var r=e._d;o&&(i=(i=Math.round(i))<0?0:i>255?255:255&i),r.v[u](t*n+r.o,i,Ze)}(this,t,e)},enumerable:!0})};g?(h=r(function(e,t,i,r){f(e,h,s,"_d");var a,o,l,c,u=0,d=0;if(C(t)){if(!(t instanceof ge||"ArrayBuffer"==(c=L(t))||"SharedArrayBuffer"==c))return Je in t?ot(h,t):ut.call(h,t);a=t,d=tt(i,n);var p=t.byteLength;if(void 0===r){if(p%n)throw oe("Wrong length!");if((o=p-d)<0)throw oe("Wrong length!")}else if((o=T(r)*n)+d>p)throw oe("Wrong length!");l=o/n}else l=S(t),a=new ge(o=l*n);for(y(e,"_d",{b:a,o:d,l:o,e:l,v:new ye(a)});u<l;)b(e,u++)}),v=h.prototype=N(Tt),y(v,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&X(function(e){new h,new h(null),new h(1.5),new h(e)},!0)||(h=r(function(e,t,i,r){var a;return f(e,h,s),C(t)?t instanceof ge||"ArrayBuffer"==(a=L(t))||"SharedArrayBuffer"==a?void 0!==r?new d(t,tt(i,n),r):void 0!==i?new d(t,tt(i,n)):new d(t):Je in t?ot(h,t):ut.call(h,t):new d(S(t))}),be(p!==Function.prototype?q(d).concat(q(p)):q(d),function(e){e in h||y(h,e,d[e])}),h.prototype=v,v.constructor=h);var w=v[He],k=!!w&&("values"==w.name||null==w.name),E=vt.values;y(h,Ge,!0),y(v,Je,s),y(v,$e,!0),y(v,Ke,h),(o?new h(1)[ze]==s:ze in v)||re(v,ze,{get:function(){return s}}),m[s]=h,a(a.G+a.W+a.F*(h!=d),m),a(a.S,s,{BYTES_PER_ELEMENT:n}),a(a.S+a.F*i(function(){d.of.call(h,1)}),s,{from:ut,of:ft}),"BYTES_PER_ELEMENT"in v||y(v,"BYTES_PER_ELEMENT",n),a(a.P,s,gt),Z(s),a(a.P+a.F*et,s,{set:yt}),a(a.P+a.F*!k,s,vt),v.toString!=Be&&(v.toString=Be),a(a.P+a.F*i(function(){new h(1).slice()}),s,{slice:mt}),a(a.P+a.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){v.toLocaleString.call([1,2])})),s,{toLocaleString:pt}),Q[s]=k?w:E,k||y(v,He,E)}}else e.exports=function(){}});dt("Int8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint8",1,function(e){return function(t,n,i){return e(this,t,n,i)}},!0),dt("Int16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint16",2,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Int32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Uint32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float32",4,function(e){return function(t,n,i){return e(this,t,n,i)}}),dt("Float64",8,function(e){return function(t,n,i){return e(this,t,n,i)}});var pt=function(e,t,n,i){try{return i?t(a(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&a(r.call(e)),t}},gt=t(function(e){var t={},n={},i=e.exports=function(e,i,r,o,s){var l,c,u,f,h=s?function(){return e}:We(e),d=E(r,o,i?2:1),p=0;if("function"!=typeof h)throw TypeError(e+" is not iterable!");if(xe(h)){for(l=D(e.length);l>p;p++)if((f=i?d(a(c=e[p])[0],c[1]):d(e[p]))===t||f===n)return f}else for(u=h.call(e);!(c=u.next()).done;)if((f=pt(u,d,c.value,i))===t||f===n)return f};i.BREAK=t,i.RETURN=n}),mt=t(function(e){var t=k("meta"),n=p.f,i=0,a=Object.isExtensible||function(){return!0},s=!o(function(){return a(Object.preventExtensions({}))}),l=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!r(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!v(e,t)){if(!a(e))return"F";if(!n)return"E";l(e)}return e[t].i},getWeak:function(e,n){if(!v(e,t)){if(!a(e))return!0;if(!n)return!1;l(e)}return e[t].w},onFreeze:function(e){return s&&c.NEED&&a(e)&&!v(e,t)&&l(e),e}}}),yt=(mt.KEY,mt.NEED,mt.fastKey,mt.getWeak,mt.onFreeze,function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}),vt=p.f,bt=mt.fastKey,wt=s?"_s":"size",kt=function(e,t){var n,i=bt(t);if("F"!==i)return e._i[i];for(n=e._f;n;n=n.n)if(n.k==t)return n},Tt={getConstructor:function(e,t,n,i){var r=e(function(e,a){F(e,r,t,"_i"),e._t=t,e._i=Ve(null),e._f=void 0,e._l=void 0,e[wt]=0,null!=a&>(a,n,e[i],e)});return I(r.prototype,{clear:function(){for(var e=yt(this,t),n=e._i,i=e._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=void 0),delete n[i.i];e._f=e._l=void 0,e[wt]=0},delete:function(e){var n=yt(this,t),i=kt(n,e);if(i){var r=i.n,a=i.p;delete n._i[i.i],i.r=!0,a&&(a.n=r),r&&(r.p=a),n._f==i&&(n._f=r),n._l==i&&(n._l=a),n[wt]--}return!!i},forEach:function(e){yt(this,t);for(var n,i=E(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(i(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!kt(yt(this,t),e)}}),s&&vt(r.prototype,"size",{get:function(){return yt(this,t)[wt]}}),r},def:function(e,t,n){var i,r,a=kt(e,t);return a?a.v=n:(e._l=a={i:r=bt(t,!0),k:t,v:n,p:i=e._l,n:void 0,r:!1},e._f||(e._f=a),i&&(i.n=a),e[wt]++,"F"!==r&&(e._i[r]=a)),e},getEntry:kt,setStrong:function(e,t,n){rt(e,t,function(e,n){this._t=yt(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?Xe(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,Xe(1))},n?"entries":"values",!n,!0),ve(t)}},St=function(e,t){if(a(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},Et={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=E(Function.call,ht.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return St(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:St},_t=Et.set,At=function(e,t,i,a,s,l){var c=n[e],u=c,f=s?"set":"add",h=u&&u.prototype,d={},p=function(e){var t=h[e];T(h,e,"delete"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(l&&!r(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return l&&!r(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof u&&(l||h.forEach&&!o(function(){(new u).entries().next()}))){var g=new u,m=g[f](l?{}:-0,1)!=g,y=o(function(){g.has(1)}),v=lt(function(e){new u(e)}),b=!l&&o(function(){for(var e=new u,t=5;t--;)e[f](t,t);return!e.has(-0)});v||((u=t(function(t,n){F(t,u,e);var i=function(e,t,n){var i,a=t.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&_t&&_t(e,i),e}(new c,t,u);return null!=n&>(n,s,i[f],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),s&&p("get")),(b||m)&&p(f),l&&h.clear&&delete h.clear}else u=a.getConstructor(t,e,s,f),I(u.prototype,i),mt.NEED=!0;return de(u,e),d[e]=u,P(P.G+P.W+P.F*(u!=c),d),l||a.setStrong(u,e,s),u},Pt=(At("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=Tt.getEntry(yt(this,"Map"),e);return t&&t.v},set:function(e,t){return Tt.def(yt(this,"Map"),0===e?0:e,t)}},Tt,!0),At("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Tt.def(yt(this,"Set"),e=0===e?0:e,e)}},Tt),{f:Object.getOwnPropertySymbols}),Mt=Object.assign,Lt=!Mt||o(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Mt({},e)[n]||Object.keys(Mt({},t)).join("")!=i})?function(e,t){for(var n=le(e),i=arguments.length,r=1,a=Pt.f,o=ut.f;i>r;)for(var s,l=z(arguments[r++]),c=a?Oe(l).concat(a(l)):Oe(l),u=c.length,f=0;u>f;)o.call(l,s=c[f++])&&(n[s]=l[s]);return n}:Mt,Ct=mt.getWeak,xt=Ye(5),Ot=Ye(6),Nt=0,jt=function(e){return e._l||(e._l=new It)},It=function(){this.a=[]},Ft=function(e,t){return xt(e.a,function(e){return e[0]===t})};It.prototype={get:function(e){var t=Ft(this,e);if(t)return t[1]},has:function(e){return!!Ft(this,e)},set:function(e,t){var n=Ft(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Ot(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Rt={getConstructor:function(e,t,n,i){var a=e(function(e,r){F(e,a,t,"_i"),e._t=t,e._i=Nt++,e._l=void 0,null!=r&>(r,n,e[i],e)});return I(a.prototype,{delete:function(e){if(!r(e))return!1;var n=Ct(e);return!0===n?jt(yt(this,t)).delete(e):n&&v(n,this._i)&&delete n[this._i]},has:function(e){if(!r(e))return!1;var n=Ct(e);return!0===n?jt(yt(this,t)).has(e):n&&v(n,this._i)}}),a},def:function(e,t,n){var i=Ct(a(t),!0);return!0===i?jt(e).set(t,n):i[e._i]=n,e},ufstore:jt};t(function(e){var t,n=Ye(0),i=mt.getWeak,a=Object.isExtensible,s=Rt.ufstore,l={},c=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},u={get:function(e){if(r(e)){var t=i(e);return!0===t?s(yt(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Rt.def(yt(this,"WeakMap"),e,t)}},f=e.exports=At("WeakMap",c,u,Rt,!0,!0);o(function(){return 7!=(new f).set((Object.freeze||Object)(l),7).get(l)})&&(t=Rt.getConstructor(c,"WeakMap"),Lt(t.prototype,u),mt.NEED=!0,n(["delete","has","get","set"],function(e){var n=f.prototype,i=n[e];T(n,e,function(n,o){if(r(n)&&!a(n)){this._f||(this._f=new t);var s=this._f[e](n,o);return"set"==e?this:s}return i.call(this,n,o)})}))});At("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return Rt.def(yt(this,"WeakSet"),e,!0)}},Rt,!1,!0);var qt=(n.Reflect||{}).apply,Vt=Function.apply;P(P.S+P.F*!o(function(){qt(function(){})}),"Reflect",{apply:function(e,t,n){var i=S(e),r=a(n);return qt?qt(i,t,r):Vt.call(i,t,r)}});var Bt=function(e,t,n){var i=void 0===n;switch(t.length){case 0:return i?e():e.call(n);case 1:return i?e(t[0]):e.call(n,t[0]);case 2:return i?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return i?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return i?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Dt=[].slice,Ut={},Ht=Function.bind||function(e){var t=S(this),n=Dt.call(arguments,1),i=function(){var r=n.concat(Dt.call(arguments));return this instanceof i?function(e,t,n){if(!(t in Ut)){for(var i=[],r=0;r<t;r++)i[r]="a["+r+"]";Ut[t]=Function("F,a","return new F("+i.join(",")+")")}return Ut[t](e,n)}(t,r.length,r):Bt(t,r,e)};return r(t.prototype)&&(i.prototype=t.prototype),i},Wt=(n.Reflect||{}).construct,zt=o(function(){function e(){}return!(Wt(function(){},[],e)instanceof e)}),Gt=!o(function(){Wt(function(){})});P(P.S+P.F*(zt||Gt),"Reflect",{construct:function(e,t){S(e),a(t);var n=arguments.length<3?e:S(arguments[2]);if(Gt&&!zt)return Wt(e,t,n);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var i=[null];return i.push.apply(i,t),new(Ht.apply(e,i))}var o=n.prototype,s=Ve(r(o)?o:Object.prototype),l=Function.apply.call(e,s,t);return r(l)?l:s}}),P(P.S+P.F*o(function(){Reflect.defineProperty(p.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,n){a(e),t=h(t,!0),a(n);try{return p.f(e,t,n),!0}catch(e){return!1}}});var Kt=ht.f;P(P.S,"Reflect",{deleteProperty:function(e,t){var n=Kt(a(e),t);return!(n&&!n.configurable)&&delete e[t]}}),P(P.S,"Reflect",{get:function e(t,n){var i,o,s=arguments.length<3?t:arguments[2];return a(t)===s?t[n]:(i=ht.f(t,n))?v(i,"value")?i.value:void 0!==i.get?i.get.call(s):void 0:r(o=Ue(t))?e(o,n,s):void 0}}),P(P.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return ht.f(a(e),t)}}),P(P.S,"Reflect",{getPrototypeOf:function(e){return Ue(a(e))}}),P(P.S,"Reflect",{has:function(e,t){return t in e}});var Yt=Object.isExtensible;P(P.S,"Reflect",{isExtensible:function(e){return a(e),!Yt||Yt(e)}});var Qt=n.Reflect,Jt=Qt&&Qt.ownKeys||function(e){var t=se.f(a(e)),n=Pt.f;return n?t.concat(n(e)):t};P(P.S,"Reflect",{ownKeys:Jt});var $t=Object.preventExtensions;P(P.S,"Reflect",{preventExtensions:function(e){a(e);try{return $t&&$t(e),!0}catch(e){return!1}}}),P(P.S,"Reflect",{set:function e(t,n,i){var o,s,l=arguments.length<4?t:arguments[3],c=ht.f(a(t),n);if(!c){if(r(s=Ue(t)))return e(s,n,i,l);c=g(0)}return v(c,"value")?!(!1===c.writable||!r(l)||((o=ht.f(l,n)||g(0)).value=i,p.f(l,n,o),0)):void 0!==c.set&&(c.set.call(l,i),!0)}}),Et&&P(P.S,"Reflect",{setPrototypeOf:function(e,t){Et.check(e,t);try{return Et.set(e,t),!0}catch(e){return!1}}});var Xt,Zt,en,tn=n.process,nn=n.setImmediate,rn=n.clearImmediate,an=n.MessageChannel,on=n.Dispatch,sn=0,ln={},cn=function(){var e=+this;if(ln.hasOwnProperty(e)){var t=ln[e];delete ln[e],t()}},un=function(e){cn.call(e.data)};nn&&rn||(nn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ln[++sn]=function(){Bt("function"==typeof e?e:Function(e),t)},Xt(sn),sn},rn=function(e){delete ln[e]},"process"==W(tn)?Xt=function(e){tn.nextTick(E(cn,e,1))}:on&&on.now?Xt=function(e){on.now(E(cn,e,1))}:an?(en=(Zt=new an).port2,Zt.port1.onmessage=un,Xt=E(en.postMessage,en,1)):n.addEventListener&&"function"==typeof postMessage&&!n.importScripts?(Xt=function(e){n.postMessage(e+"","*")},n.addEventListener("message",un,!1)):Xt="onreadystatechange"in u("script")?function(e){Ie.appendChild(u("script")).onreadystatechange=function(){Ie.removeChild(this),cn.call(e)}}:function(e){setTimeout(E(cn,e,1),0)});var fn={set:nn,clear:rn},hn=fn.set,dn=n.MutationObserver||n.WebKitMutationObserver,pn=n.process,gn=n.Promise,mn="process"==W(pn);function yn(e){var t,n;this.promise=new e(function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i}),this.resolve=S(t),this.reject=S(n)}var vn,bn,wn,kn,Tn={f:function(e){return new yn(e)}},Sn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},En=fn.set,_n=function(){var e,t,i,r=function(){var n,r;for(mn&&(n=pn.domain)&&n.exit();e;){r=e.fn,e=e.next;try{r()}catch(n){throw e?i():t=void 0,n}}t=void 0,n&&n.enter()};if(mn)i=function(){pn.nextTick(r)};else if(!dn||n.navigator&&n.navigator.standalone)if(gn&&gn.resolve){var a=gn.resolve();i=function(){a.then(r)}}else i=function(){hn.call(n,r)};else{var o=!0,s=document.createTextNode("");new dn(r).observe(s,{characterData:!0}),i=function(){s.data=o=!o}}return function(n){var r={fn:n,next:void 0};t&&(t.next=r),e||(e=r,i()),t=r}}(),An=n.TypeError,Pn=n.process,Mn=n.Promise,Ln="process"==Pe(Pn),Cn=function(){},xn=bn=Tn.f,On=!!function(){try{var e=Mn.resolve(1),t=(e.constructor={})[ue("species")]=function(e){e(Cn,Cn)};return(Ln||"function"==typeof PromiseRejectionEvent)&&e.then(Cn)instanceof t}catch(e){}}(),Nn=function(e){var t;return!(!r(e)||"function"!=typeof(t=e.then))&&t},jn=function(e,t){if(!e._n){e._n=!0;var n=e._c;_n(function(){for(var i=e._v,r=1==e._s,a=0,o=function(t){var n,a,o=r?t.ok:t.fail,s=t.resolve,l=t.reject,c=t.domain;try{o?(r||(2==e._h&&Rn(e),e._h=1),!0===o?n=i:(c&&c.enter(),n=o(i),c&&c.exit()),n===t.promise?l(An("Promise-chain cycle")):(a=Nn(n))?a.call(n,s,l):s(n)):l(i)}catch(e){l(e)}};n.length>a;)o(n[a++]);e._c=[],e._n=!1,t&&!e._h&&In(e)})}},In=function(e){En.call(n,function(){var t,i,r,a=e._v,o=Fn(e);if(o&&(t=Sn(function(){Ln?Pn.emit("unhandledRejection",a,e):(i=n.onunhandledrejection)?i({promise:e,reason:a}):(r=n.console)&&r.error&&r.error("Unhandled promise rejection",a)}),e._h=Ln||Fn(e)?2:1),e._a=void 0,o&&t.e)throw t.v})},Fn=function(e){return 1!==e._h&&0===(e._a||e._c).length},Rn=function(e){En.call(n,function(){var t;Ln?Pn.emit("rejectionHandled",e):(t=n.onrejectionhandled)&&t({promise:e,reason:e._v})})},qn=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),jn(t,!0))},Vn=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw An("Promise can't be resolved itself");(t=Nn(e))?_n(function(){var i={_w:n,_d:!1};try{t.call(e,E(Vn,i,1),E(qn,i,1))}catch(e){qn.call(i,e)}}):(n._v=e,n._s=1,jn(n,!1))}catch(e){qn.call({_w:n,_d:!1},e)}}};On||(Mn=function(e){F(this,Mn,"Promise","_h"),S(e),vn.call(this);try{e(E(Vn,this,1),E(qn,this,1))}catch(e){qn.call(this,e)}},(vn=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=I(Mn.prototype,{then:function(e,t){var n=xn(me(this,Mn));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=Ln?Pn.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&jn(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),wn=function(){var e=new vn;this.promise=e,this.resolve=E(Vn,e,1),this.reject=E(qn,e,1)},Tn.f=xn=function(e){return e===Mn||e===kn?new wn(e):bn(e)}),P(P.G+P.W+P.F*!On,{Promise:Mn}),de(Mn,"Promise"),ve("Promise"),kn=i.Promise,P(P.S+P.F*!On,"Promise",{reject:function(e){var t=xn(this);return(0,t.reject)(e),t.promise}}),P(P.S+P.F*!On,"Promise",{resolve:function(e){return function(e,t){if(a(e),r(t)&&t.constructor===e)return t;var n=Tn.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),P(P.S+P.F*!(On&<(function(e){Mn.all(e).catch(Cn)})),"Promise",{all:function(e){var t=this,n=xn(t),i=n.resolve,r=n.reject,a=Sn(function(){var n=[],a=0,o=1;gt(e,!1,function(e){var s=a++,l=!1;n.push(void 0),o++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--o||i(n))},r)}),--o||i(n)});return a.e&&r(a.v),n.promise},race:function(e){var t=this,n=xn(t),i=n.reject,r=Sn(function(){gt(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var Bn={f:ue},Dn=p.f,Un=function(e){var t=i.Symbol||(i.Symbol=n.Symbol||{});"_"==e.charAt(0)||e in t||Dn(t,e,{value:Bn.f(e)})},Hn=se.f,Wn={}.toString,zn="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Gn={f:function(e){return zn&&"[object Window]"==Wn.call(e)?function(e){try{return Hn(e)}catch(e){return zn.slice()}}(e):Hn(K(e))}},Kn=mt.KEY,Yn=ht.f,Qn=p.f,Jn=Gn.f,$n=n.Symbol,Xn=n.JSON,Zn=Xn&&Xn.stringify,ei=ue("_hidden"),ti=ue("toPrimitive"),ni={}.propertyIsEnumerable,ii=Z("symbol-registry"),ri=Z("symbols"),ai=Z("op-symbols"),oi=Object.prototype,si="function"==typeof $n,li=n.QObject,ci=!li||!li.prototype||!li.prototype.findChild,ui=s&&o(function(){return 7!=Ve(Qn({},"a",{get:function(){return Qn(this,"a",{value:7}).a}})).a})?function(e,t,n){var i=Yn(oi,t);i&&delete oi[t],Qn(e,t,n),i&&e!==oi&&Qn(oi,t,i)}:Qn,fi=function(e){var t=ri[e]=Ve($n.prototype);return t._k=e,t},hi=si&&"symbol"==typeof $n.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $n},di=function(e,t,n){return e===oi&&di(ai,t,n),a(e),t=h(t,!0),a(n),v(ri,t)?(n.enumerable?(v(e,ei)&&e[ei][t]&&(e[ei][t]=!1),n=Ve(n,{enumerable:g(0,!1)})):(v(e,ei)||Qn(e,ei,g(1,{})),e[ei][t]=!0),ui(e,t,n)):Qn(e,t,n)},pi=function(e,t){a(e);for(var n,i=function(e){var t=Oe(e),n=Pt.f;if(n)for(var i,r=n(e),a=ut.f,o=0;r.length>o;)a.call(e,i=r[o++])&&t.push(i);return t}(t=K(t)),r=0,o=i.length;o>r;)di(e,n=i[r++],t[n]);return e},gi=function(e){var t=ni.call(this,e=h(e,!0));return!(this===oi&&v(ri,e)&&!v(ai,e))&&(!(t||!v(this,e)||!v(ri,e)||v(this,ei)&&this[ei][e])||t)},mi=function(e,t){if(e=K(e),t=h(t,!0),e!==oi||!v(ri,t)||v(ai,t)){var n=Yn(e,t);return!n||!v(ri,t)||v(e,ei)&&e[ei][t]||(n.enumerable=!0),n}},yi=function(e){for(var t,n=Jn(K(e)),i=[],r=0;n.length>r;)v(ri,t=n[r++])||t==ei||t==Kn||i.push(t);return i},vi=function(e){for(var t,n=e===oi,i=Jn(n?ai:K(e)),r=[],a=0;i.length>a;)!v(ri,t=i[a++])||n&&!v(oi,t)||r.push(ri[t]);return r};si||(T(($n=function(){if(this instanceof $n)throw TypeError("Symbol is not a constructor!");var e=k(arguments.length>0?arguments[0]:void 0),t=function(n){this===oi&&t.call(ai,n),v(this,ei)&&v(this[ei],e)&&(this[ei][e]=!1),ui(this,e,g(1,n))};return s&&ci&&ui(oi,e,{configurable:!0,set:t}),fi(e)}).prototype,"toString",function(){return this._k}),ht.f=mi,p.f=di,se.f=Gn.f=yi,ut.f=gi,Pt.f=vi,s&&T(oi,"propertyIsEnumerable",gi,!0),Bn.f=function(e){return fi(ue(e))}),P(P.G+P.W+P.F*!si,{Symbol:$n});for(var bi="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),wi=0;bi.length>wi;)ue(bi[wi++]);for(var ki=Oe(ue.store),Ti=0;ki.length>Ti;)Un(ki[Ti++]);P(P.S+P.F*!si,"Symbol",{for:function(e){return v(ii,e+="")?ii[e]:ii[e]=$n(e)},keyFor:function(e){if(!hi(e))throw TypeError(e+" is not a symbol!");for(var t in ii)if(ii[t]===e)return t},useSetter:function(){ci=!0},useSimple:function(){ci=!1}}),P(P.S+P.F*!si,"Object",{create:function(e,t){return void 0===t?Ve(e):pi(Ve(e),t)},defineProperty:di,defineProperties:pi,getOwnPropertyDescriptor:mi,getOwnPropertyNames:yi,getOwnPropertySymbols:vi}),Xn&&P(P.S+P.F*(!si||o(function(){var e=$n();return"[null]"!=Zn([e])||"{}"!=Zn({a:e})||"{}"!=Zn(Object(e))})),"JSON",{stringify:function(e){for(var t,n,i=[e],a=1;arguments.length>a;)i.push(arguments[a++]);if(n=t=i[1],(r(t)||void 0!==e)&&!hi(e))return ze(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!hi(t))return t}),i[1]=t,Zn.apply(Xn,i)}}),$n.prototype[ti]||m($n.prototype,ti,$n.prototype.valueOf),de($n,"Symbol"),de(Math,"Math",!0),de(n.JSON,"JSON",!0);var Si=function(e,t){var n=(i.Object||{})[e]||Object[e],r={};r[e]=t(n),P(P.S+P.F*o(function(){n(1)}),"Object",r)},Ei=mt.onFreeze;Si("freeze",function(e){return function(t){return e&&r(t)?e(Ei(t)):t}});var _i=mt.onFreeze;Si("seal",function(e){return function(t){return e&&r(t)?e(_i(t)):t}});var Ai=mt.onFreeze;Si("preventExtensions",function(e){return function(t){return e&&r(t)?e(Ai(t)):t}}),Si("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}}),Si("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}});var Pi=ht.f;Si("getOwnPropertyDescriptor",function(){return function(e,t){return Pi(K(e),t)}}),Si("getPrototypeOf",function(){return function(e){return Ue(le(e))}}),Si("keys",function(){return function(e){return Oe(le(e))}}),Si("getOwnPropertyNames",function(){return Gn.f}),P(P.S+P.F,"Object",{assign:Lt});var Mi=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};P(P.S,"Object",{is:Mi});var Li=p.f,Ci=Function.prototype,xi=/^\s*function ([^ (]*)/;"name"in Ci||s&&Li(Ci,"name",{configurable:!0,get:function(){try{return(""+this).match(xi)[1]}catch(e){return""}}}),P(P.S,"String",{raw:function(e){for(var t=K(e.raw),n=D(t.length),i=arguments.length,r=[],a=0;n>a;)r.push(String(t[a++])),a<i&&r.push(String(arguments[a]));return r.join("")}});var Oi=String.fromCharCode,Ni=String.fromCodePoint;P(P.S+P.F*(!!Ni&&1!=Ni.length),"String",{fromCodePoint:function(e){for(var t,n=[],i=arguments.length,r=0;i>r;){if(t=+arguments[r++],J(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?Oi(t):Oi(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}});var ji,Ii=(ji=!1,function(e,t){var n,i,r=String(G(e)),a=V(t),o=r.length;return a<0||a>=o?ji?"":void 0:(n=r.charCodeAt(a))<55296||n>56319||a+1===o||(i=r.charCodeAt(a+1))<56320||i>57343?ji?r.charAt(a):n:ji?r.slice(a,a+2):i-56320+(n-55296<<10)+65536});P(P.P,"String",{codePointAt:function(e){return Ii(this,e)}});var Fi=function(e){var t=String(G(this)),n="",i=V(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n};P(P.P,"String",{repeat:Fi});var Ri=ue("match"),qi=function(e){var t;return r(e)&&(void 0!==(t=e[Ri])?!!t:"RegExp"==W(e))},Vi=function(e,t,n){if(qi(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(G(e))},Bi=ue("match"),Di=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Bi]=!1,!"/./"[e](t)}catch(e){}}return!0},Ui="".startsWith;P(P.P+P.F*Di("startsWith"),"String",{startsWith:function(e){var t=Vi(this,e,"startsWith"),n=D(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return Ui?Ui.call(t,i,n):t.slice(n,n+i.length)===i}});var Hi="".endsWith;P(P.P+P.F*Di("endsWith"),"String",{endsWith:function(e){var t=Vi(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,i=D(t.length),r=void 0===n?i:Math.min(D(n),i),a=String(e);return Hi?Hi.call(t,a,r):t.slice(r-a.length,r)===a}});P(P.P+P.F*Di("includes"),"String",{includes:function(e){return!!~Vi(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});s&&"g"!=/./g.flags&&p.f(RegExp.prototype,"flags",{configurable:!0,get:function(){var e=a(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}});var Wi=function(e,t,n){var i=ue(e),r=n(G,i,""[e]),a=r[0],s=r[1];o(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(T(String.prototype,e,a),m(RegExp.prototype,i,2==t?function(e,t){return s.call(e,this,t)}:function(e){return s.call(e,this)}))};Wi("match",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]}),Wi("replace",2,function(e,t,n){return[function(i,r){var a=e(this),o=null==i?void 0:i[t];return void 0!==o?o.call(i,a,r):n.call(String(a),i,r)},n]}),Wi("split",2,function(e,t,n){var i=qi,r=n,a=[].push;if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length){var o=void 0===/()??/.exec("")[1];n=function(e,t){var n=String(this);if(void 0===e&&0===t)return[];if(!i(e))return r.call(n,e,t);var s,l,c,u,f,h=[],d=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,g=void 0===t?4294967295:t>>>0,m=new RegExp(e.source,d+"g");for(o||(s=new RegExp("^"+m.source+"$(?!\\s)",d));(l=m.exec(n))&&!((c=l.index+l[0].length)>p&&(h.push(n.slice(p,l.index)),!o&&l.length>1&&l[0].replace(s,function(){for(f=1;f<arguments.length-2;f++)void 0===arguments[f]&&(l[f]=void 0)}),l.length>1&&l.index<n.length&&a.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=g));)m.lastIndex===l.index&&m.lastIndex++;return p===n.length?!u&&m.test("")||h.push(""):h.push(n.slice(p)),h.length>g?h.slice(0,g):h}}else"0".split(void 0,0).length&&(n=function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)});return[function(i,r){var a=e(this),o=null==i?void 0:i[t];return void 0!==o?o.call(i,a,r):n.call(String(a),i,r)},n]}),Wi("search",1,function(e,t,n){return[function(n){var i=e(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,i):new RegExp(n)[t](String(i))},n]});var zi=function(e,t,n){t in e?p.f(e,t,g(0,n)):e[t]=n};P(P.S+P.F*!lt(function(e){}),"Array",{from:function(e){var t,n,i,r,a=le(e),o="function"==typeof this?this:Array,s=arguments.length,l=s>1?arguments[1]:void 0,c=void 0!==l,u=0,f=We(a);if(c&&(l=E(l,s>2?arguments[2]:void 0,2)),null==f||o==Array&&xe(f))for(n=new o(t=D(a.length));t>u;u++)zi(n,u,c?l(a[u],u):a[u]);else for(r=f.call(a),n=new o;!(i=r.next()).done;u++)zi(n,u,c?pt(r,l,[i.value,u],!0):i.value);return n.length=u,n}}),P(P.S+P.F*o(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)zi(n,e,arguments[e++]);return n.length=t,n}}),P(P.P,"Array",{copyWithin:ct}),$e("copyWithin");var Gi=Ye(5),Ki=!0;"find"in[]&&Array(1).find(function(){Ki=!1}),P(P.P+P.F*Ki,"Array",{find:function(e){return Gi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("find");var Yi=Ye(6),Qi=!0;"findIndex"in[]&&Array(1).findIndex(function(){Qi=!1}),P(P.P+P.F*Qi,"Array",{findIndex:function(e){return Yi(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("findIndex"),P(P.P,"Array",{fill:ce}),$e("fill");var Ji=n.isFinite;P(P.S,"Number",{isFinite:function(e){return"number"==typeof e&&Ji(e)}});var $i=Math.floor,Xi=function(e){return!r(e)&&isFinite(e)&&$i(e)===e};P(P.S,"Number",{isInteger:Xi});var Zi=Math.abs;P(P.S,"Number",{isSafeInteger:function(e){return Xi(e)&&Zi(e)<=9007199254740991}}),P(P.S,"Number",{isNaN:function(e){return e!=e}}),P(P.S,"Number",{EPSILON:Math.pow(2,-52)}),P(P.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991}),P(P.S,"Number",{MAX_SAFE_INTEGER:9007199254740991});var er=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)},tr=Math.sqrt,nr=Math.acosh;P(P.S+P.F*!(nr&&710==Math.floor(nr(Number.MAX_VALUE))&&nr(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:er(e-1+tr(e-1)*tr(e+1))}});var ir=Math.asinh;P(P.S+P.F*!(ir&&1/ir(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}});var rr=Math.atanh;P(P.S+P.F*!(rr&&1/rr(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}});var ar=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};P(P.S,"Math",{cbrt:function(e){return ar(e=+e)*Math.pow(Math.abs(e),1/3)}}),P(P.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}});var or=Math.exp;P(P.S,"Math",{cosh:function(e){return(or(e=+e)+or(-e))/2}});var sr=Math.expm1,lr=!sr||sr(10)>22025.465794806718||sr(10)<22025.465794806718||-2e-17!=sr(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:sr;P(P.S+P.F*(lr!=Math.expm1),"Math",{expm1:lr});var cr=Math.pow,ur=cr(2,-52),fr=cr(2,-23),hr=cr(2,127)*(2-fr),dr=cr(2,-126),pr=Math.fround||function(e){var t,n,i=Math.abs(e),r=ar(e);return i<dr?r*(i/dr/fr+1/ur-1/ur)*dr*fr:(n=(t=(1+fr/ur)*i)-(t-i))>hr||n!=n?r*(1/0):r*n};P(P.S,"Math",{fround:pr});var gr=Math.abs;P(P.S,"Math",{hypot:function(e,t){for(var n,i,r=0,a=0,o=arguments.length,s=0;a<o;)s<(n=gr(arguments[a++]))?(r=r*(i=s/n)*i+1,s=n):r+=n>0?(i=n/s)*i:n;return s===1/0?1/0:s*Math.sqrt(r)}});var mr=Math.imul;P(P.S+P.F*o(function(){return-5!=mr(4294967295,5)||2!=mr.length}),"Math",{imul:function(e,t){var n=+e,i=+t,r=65535&n,a=65535&i;return 0|r*a+((65535&n>>>16)*a+r*(65535&i>>>16)<<16>>>0)}}),P(P.S,"Math",{log1p:er}),P(P.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}}),P(P.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}}),P(P.S,"Math",{sign:ar});var yr=Math.exp;P(P.S+P.F*o(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(lr(e)-lr(-e))/2:(yr(e-1)-yr(-e-1))*(Math.E/2)}});var vr=Math.exp;P(P.S,"Math",{tanh:function(e){var t=lr(e=+e),n=lr(-e);return t==1/0?1:n==1/0?-1:(t-n)/(vr(e)+vr(-e))}}),P(P.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}});var br=$(!0);P(P.P,"Array",{includes:function(e){return br(this,e,arguments.length>1?arguments[1]:void 0)}}),$e("includes");var wr=ut.f,kr=function(e){return function(t){for(var n,i=K(t),r=Oe(i),a=r.length,o=0,s=[];a>o;)wr.call(i,n=r[o++])&&s.push(e?[n,i[n]]:i[n]);return s}},Tr=kr(!1);P(P.S,"Object",{values:function(e){return Tr(e)}});var Sr=kr(!0);P(P.S,"Object",{entries:function(e){return Sr(e)}}),P(P.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,i=K(e),r=ht.f,a=Jt(i),o={},s=0;a.length>s;)void 0!==(n=r(i,t=a[s++]))&&zi(o,t,n);return o}});var Er=function(e,t,n,i){var r=String(G(e)),a=r.length,o=void 0===n?" ":String(n),s=D(t);if(s<=a||""==o)return r;var l=s-a,c=Fi.call(o,Math.ceil(l/o.length));return c.length>l&&(c=c.slice(0,l)),i?c+r:r+c},_r=n.navigator,Ar=_r&&_r.userAgent||"";P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padStart:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!0)}}),P(P.P+P.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(Ar),"String",{padEnd:function(e){return Er(this,e,arguments.length>1?arguments[1]:void 0,!1)}});var Pr=[].slice,Mr=/MSIE .\./.test(Ar),Lr=function(e){return function(t,n){var i=arguments.length>2,r=!!i&&Pr.call(arguments,2);return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};P(P.G+P.B+P.F*Mr,{setTimeout:Lr(n.setTimeout),setInterval:Lr(n.setInterval)}),P(P.G+P.B,{setImmediate:fn.set,clearImmediate:fn.clear});for(var Cr=ue("iterator"),xr=ue("toStringTag"),Or=Me.Array,Nr={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},jr=Oe(Nr),Ir=0;Ir<jr.length;Ir++){var Fr,Rr=jr[Ir],qr=Nr[Rr],Vr=n[Rr],Br=Vr&&Vr.prototype;if(Br&&(Br[Cr]||m(Br,Cr,Or),Br[xr]||m(Br,xr,Rr),Me[Rr]=Or,qr))for(Fr in at)Br[Fr]||T(Br,Fr,at[Fr],!0)}t(function(t){!function(e){var n,i=Object.prototype,r=i.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag",c=e.regeneratorRuntime;if(c)t.exports=c;else{(c=e.regeneratorRuntime=t.exports).wrap=b;var u="suspendedStart",f="suspendedYield",h="executing",d="completed",p={},g={};g[o]=function(){return this};var m=Object.getPrototypeOf,y=m&&m(m(C([])));y&&y!==i&&r.call(y,o)&&(g=y);var v=S.prototype=k.prototype=Object.create(g);T.prototype=v.constructor=S,S.constructor=T,S[l]=T.displayName="GeneratorFunction",c.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===T||"GeneratorFunction"===(t.displayName||t.name))},c.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,S):(e.__proto__=S,l in e||(e[l]="GeneratorFunction")),e.prototype=Object.create(v),e},c.awrap=function(e){return{__await:e}},E(_.prototype),_.prototype[s]=function(){return this},c.AsyncIterator=_,c.async=function(e,t,n,i){var r=new _(b(e,t,n,i));return c.isGeneratorFunction(t)?r:r.next().then(function(e){return e.done?e.value:r.next()})},E(v),v[l]="Generator",v[o]=function(){return this},v.toString=function(){return"[object Generator]"},c.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var i=t.pop();if(i in e)return n.value=i,n.done=!1,n}return n.done=!0,n}},c.values=C,L.prototype={constructor:L,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=n,this.done=!1,this.delegate=null,this.method="next",this.arg=n,this.tryEntries.forEach(M),!e)for(var t in this)"t"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function i(i,r){return s.type="throw",s.arg=e,t.next=i,r&&(t.method="next",t.arg=n),!!r}for(var a=this.tryEntries.length-1;a>=0;--a){var o=this.tryEntries[a],s=o.completion;if("root"===o.tryLoc)return i("end");if(o.tryLoc<=this.prev){var l=r.call(o,"catchLoc"),c=r.call(o,"finallyLoc");if(l&&c){if(this.prev<o.catchLoc)return i(o.catchLoc,!0);if(this.prev<o.finallyLoc)return i(o.finallyLoc)}else if(l){if(this.prev<o.catchLoc)return i(o.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return i(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var a=i;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var o=a?a.completion:{};return o.type=e,o.arg=t,a?(this.method="next",this.next=a.finallyLoc,p):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),M(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var i=n.completion;if("throw"===i.type){var r=i.arg;M(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,i){return this.delegate={iterator:C(e),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=n),p}}}function b(e,t,n,i){var r=t&&t.prototype instanceof k?t:k,a=Object.create(r.prototype),o=new L(i||[]);return a._invoke=function(e,t,n){var i=u;return function(r,a){if(i===h)throw new Error("Generator is already running");if(i===d){if("throw"===r)throw a;return x()}for(n.method=r,n.arg=a;;){var o=n.delegate;if(o){var s=A(o,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(i===u)throw i=d,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);i=h;var l=w(e,t,n);if("normal"===l.type){if(i=n.done?d:f,l.arg===p)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(i=d,n.method="throw",n.arg=l.arg)}}}(e,n,o),a}function w(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function k(){}function T(){}function S(){}function E(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function _(t){function n(e,i,a,o){var s=w(t[e],t,i);if("throw"!==s.type){var l=s.arg,c=l.value;return c&&"object"==typeof c&&r.call(c,"__await")?Promise.resolve(c.__await).then(function(e){n("next",e,a,o)},function(e){n("throw",e,a,o)}):Promise.resolve(c).then(function(e){l.value=e,a(l)},o)}o(s.arg)}var i;"object"==typeof e.process&&e.process.domain&&(n=e.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise(function(i,r){n(e,t,i,r)})}return i=i?i.then(r,r):r()}}function A(e,t){var i=e.iterator[t.method];if(i===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=n,A(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=w(i,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var a=r.arg;return a?a.done?(t[e.resultName]=a.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=n),t.delegate=null,p):a:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function P(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function M(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(P,this),this.reset(!0)}function C(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,a=function t(){for(;++i<e.length;)if(r.call(e,i))return t.value=e[i],t.done=!1,t;return t.value=n,t.done=!0,t};return a.next=a}}return{next:x}}function x(){return{value:n,done:!0}}}("object"==typeof e?e:"object"==typeof window?window:"object"==typeof self?self:e)});try{var Dr=new window.CustomEvent("test");if(Dr.preventDefault(),!0!==Dr.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var Ur=function(e,t){var n,i;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),i=n.preventDefault,n.preventDefault=function(){i.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};Ur.prototype=window.Event.prototype,window.CustomEvent=Ur}!function(e){var t=function(){try{return!!Symbol.iterator}catch(e){return!1}}(),n=function(e){var n={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t&&(n[Symbol.iterator]=function(){return n}),n},i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},r=function(e){return decodeURIComponent(e).replace(/\+/g," ")};"URLSearchParams"in e&&"a=1"===new URLSearchParams("?a=1").toString()||function(){var a=function(e){if(Object.defineProperty(this,"_entries",{value:{}}),"string"==typeof e){if(""!==e)for(var t,n=(e=e.replace(/^\?/,"")).split("&"),i=0;i<n.length;i++)t=n[i].split("="),this.append(r(t[0]),t.length>1?r(t[1]):"")}else if(e instanceof a){var o=this;e.forEach(function(e,t){o.append(e,t)})}},o=a.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(t.toString()):this._entries[e]=[t.toString()]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[t.toString()]},o.forEach=function(e,t){var n;for(var i in this._entries)if(this._entries.hasOwnProperty(i)){n=this._entries[i];for(var r=0;r<n.length;r++)e.call(t,n[r],i,this)}},o.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),n(e)},o.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),n(e)},o.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e="";return this.forEach(function(t,n){e.length>0&&(e+="&"),e+=i(n)+"="+i(t)}),e},e.URLSearchParams=a}()}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var e=new URL("b","http://a");return e.pathname="c%20d","http://a/c%20d"===e.href&&e.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(e,t){"string"!=typeof e&&(e=String(e));var n=document.implementation.createHTMLDocument("");if(window.doc=n,t){var i=n.createElement("base");i.href=t,n.head.appendChild(i)}var r=n.createElement("a");if(r.href=e,n.body.appendChild(r),r.href=r.href,":"===r.protocol||!/:/.test(r.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:r})},i=n.prototype;["hash","host","hostname","port","protocol","search"].forEach(function(e){!function(e){Object.defineProperty(i,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)}),Object.defineProperties(i,{toString:{get:function(){var e=this;return function(){return e.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(e){this._anchorElement.href=e},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(e){this._anchorElement.pathname=e},enumerable:!0},origin:{get:function(){var e={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],t=this._anchorElement.port!=e&&""!==this._anchorElement.port;return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(t?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(e){},enumerable:!0},username:{get:function(){return""},set:function(e){},enumerable:!0},searchParams:{get:function(){var e=new URLSearchParams(this.search),t=this;return["append","delete","set"].forEach(function(n){var i=e[n];e[n]=function(){i.apply(e,arguments),t.search=e.toString()}}),e},enumerable:!0}}),n.createObjectURL=function(e){return t.createObjectURL.apply(t,arguments)},n.revokeObjectURL=function(e){return t.revokeObjectURL.apply(t,arguments)},e.URL=n}(),void 0!==e.location&&!("origin"in e.location)){var t=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:t,enumerable:!0})}catch(n){setInterval(function(){e.location.origin=t()},100)}}}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e);var Hr=function(e){return null!=e?e.constructor:null},Wr=function(e,t){return Boolean(e&&t&&e instanceof t)},zr={object:function(e){return Hr(e)===Object},number:function(e){return Hr(e)===Number&&!Number.isNaN(e)},string:function(e){return Hr(e)===String},boolean:function(e){return Hr(e)===Boolean},function:function(e){return Hr(e)===Function},array:function(e){return!zr.nullOrUndefined(e)&&Array.isArray(e)},weakMap:function(e){return Wr(e,WeakMap)},nodeList:function(e){return Wr(e,NodeList)},element:function(e){return Wr(e,Element)},textNode:function(e){return Hr(e)===Text},event:function(e){return Wr(e,Event)},cue:function(e){return Wr(e,window.TextTrackCue)||Wr(e,window.VTTCue)},track:function(e){return Wr(e,TextTrack)||!zr.nullOrUndefined(e)&&zr.string(e.kind)},url:function(e){return!zr.nullOrUndefined(e)&&/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/.test(e)},nullOrUndefined:function(e){return null==e},empty:function(e){return zr.nullOrUndefined(e)||(zr.string(e)||zr.array(e)||zr.nodeList(e))&&!e.length||zr.object(e)&&!Object.keys(e).length}},Gr=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}();function Kr(e,t,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this,o=arguments.length>5&&void 0!==arguments[5]&&arguments[5],s=arguments.length>6&&void 0!==arguments[6]&&arguments[6];if(!zr.empty(e)&&!zr.empty(t)&&zr.function(n))if(zr.nodeList(e)||zr.array(e))Array.from(e).forEach(function(e){e instanceof Node&&Kr.call(null,e,t,n,i,r,o)});else{var l=t.split(" "),c=o;Gr&&(c={passive:r,capture:o}),l.forEach(function(t){a&&a.eventListeners&&i&&!s&&a.eventListeners.push({elements:e,type:t,callback:n,options:c}),e[i?"addEventListener":"removeEventListener"](t,n,c)})}}function Yr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Kr.call(this,e,t,n,!0,i,r)}function Qr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Kr.call(this,e,t,n,!1,i,r)}function Jr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments[2],i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Kr(e,t,function a(){Qr(e,t,a,i,r);for(var o=arguments.length,s=Array(o),l=0;l<o;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r,!0)}function $r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(zr.element(e)&&!zr.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}var Xr=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},Zr=function(){function e(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(t,n,i){return n&&e(t.prototype,n),i&&e(t,i),t}}(),ea=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},ta=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],i=!0,r=!1,a=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,a=e}finally{try{!i&&s.return&&s.return()}finally{if(r)throw a}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();function na(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,r=e.parentNode,a=e.nextSibling;i.appendChild(e),a?r.insertBefore(i,a):r.appendChild(i)})}function ia(e,t){zr.element(e)&&!zr.empty(t)&&Object.entries(t).forEach(function(t){var n=ta(t,2),i=n[0],r=n[1];e.setAttribute(i,r)})}function ra(e,t,n){var i=document.createElement(e);return zr.object(t)&&ia(i,t),zr.string(n)&&(i.innerText=n),i}function aa(e,t,n,i){t.appendChild(ra(e,n,i))}function oa(e){zr.nodeList(e)||zr.array(e)?Array.from(e).forEach(oa):zr.element(e)&&zr.element(e.parentNode)&&e.parentNode.removeChild(e)}function sa(e){for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function la(e,t){return zr.element(t)&&zr.element(t.parentNode)&&zr.element(e)?(t.parentNode.replaceChild(e,t),e):null}function ca(e,t){if(!zr.string(e)||zr.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),r=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),o=a[0],s=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":zr.object(i)&&zr.string(i.class)&&(i.class+=" "+r),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=s}}),n}function ua(e,t){if(zr.element(e)){var n=t;zr.boolean(n)||(n=!e.hasAttribute("hidden")),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function fa(e,t,n){if(zr.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return null}function ha(e,t){return zr.element(e)&&e.classList.contains(t)}function da(e,t){var n={Element:Element};return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function pa(e){return this.elements.container.querySelectorAll(e)}function ga(e){return this.elements.container.querySelector(e)}function ma(){var e=document.activeElement;return e=e&&e!==document.body?document.querySelector(":focus"):null}function ya(e,t){if(zr.array(e)||zr.nodeList(e))Array.from(e).forEach(function(e){return ya(e,t)});else if(zr.element(e)){var n="true"===e.getAttribute("aria-pressed"),i=zr.boolean(t)?t:!n;e.setAttribute("aria-pressed",i)}}var va,ba,wa,ka=(va=document.createElement("span"),ba={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},wa=Object.keys(ba).find(function(e){return void 0!==va.style[e]}),!!zr.string(wa)&&ba[wa]);var Ta,Sa={isIE:!!document.documentMode,isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:/(iPad|iPhone|iPod)/gi.test(navigator.platform)},Ea={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=!1,r=!1,a=Sa.isIPhone&&n&&Ea.playsinline;switch(t+":"+e){case"html5:video":r=(i=Ea.video)&&Ea.rangeInput&&(!Sa.isIPhone||a);break;case"html5:audio":r=(i=Ea.audio)&&Ea.rangeInput;break;case"youtube:video":case"vimeo:video":i=!0,r=Ea.rangeInput&&(!Sa.isIPhone||a);break;default:r=(i=Ea.audio&&Ea.video)&&Ea.rangeInput}return{api:i,ui:r}},pip:!Sa.isIPhone&&zr.function(ra("video").webkitSetPresentationMode),airplay:zr.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t=this.media;try{if(!this.isHTML5||!zr.function(t.canPlayType))return!1;if(e.includes("codecs="))return t.canPlayType(e).replace(/no/,"");if(this.isVideo)switch(e){case"video/webm":return t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,"");case"video/mp4":return t.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,"");case"video/ogg":return t.canPlayType('video/ogg; codecs="theora"').replace(/no/,"");default:return!1}else if(this.isAudio)switch(e){case"audio/mpeg":return t.canPlayType("audio/mpeg;").replace(/no/,"");case"audio/ogg":return t.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,"");case"audio/wav":return t.canPlayType('audio/wav; codecs="1"').replace(/no/,"");default:return!1}}catch(e){return!1}return!1},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Ta=document.createElement("input"),Ta.type="range","range"===Ta.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==ka,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},_a={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return Ea.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return _a.getSources.call(this).map(function(e){return Number(e.getAttribute("size"))}).filter(Boolean)},extend:function(){if(this.isHTML5){var e=this;Object.defineProperty(e.media,"quality",{get:function(){var t=_a.getSources.call(e).filter(function(t){return t.getAttribute("src")===e.source}),n=ta(t,1)[0];return n&&Number(n.getAttribute("size"))},set:function(t){var n=_a.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.currentTime,r=e.playing;e.media.src=n.getAttribute("src");e.once("loadedmetadata",function(){e.currentTime=i}),e.media.load(),r&&e.play(),$r.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(oa(_a.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Aa(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];if(!n.length)return e;var r=n.shift();return zr.object(r)?(Object.keys(r).forEach(function(t){zr.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,ea({},t,{})),Aa(e[t],r[t])):Object.assign(e,ea({},t,r[t]))}),Aa.apply(void 0,[e].concat(n))):e}function Pa(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return zr.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return zr.string(n[t])?n[t]:""})}function Ma(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),n.toString())}function La(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString().replace(/\w\S*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()})}function Ca(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return e=Ma(e,"-"," "),e=Ma(e,"_"," "),Ma(e=La(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function xa(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Oa=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(zr.empty(e)||zr.empty(t))return"";var n,i=(n=t.i18n,e.split(".").reduce(function(e,t){return e&&e[t]},n));if(zr.empty(i))return"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach(function(e){var t=ta(e,2),n=t[0],r=t[1];i=Ma(i,n,r)}),i};function Na(e){return zr.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}var ja=function(){function e(t){Xr(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return Zr(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(zr.empty(n))return null;var i=JSON.parse(n);return zr.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&zr.object(t)){var n=this.get();zr.empty(n)&&(n={}),Aa(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;return window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0}catch(e){return!1}}}]),e}();function Ia(e,t){if(zr.string(e)){var n=zr.string(t),i=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var a=ja.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),a){var s=window.localStorage.getItem("cache-"+t);if(null!==s){var l=JSON.parse(s);r(o,l.content)}}fetch(e).then(function(e){zr.empty(e)||(a&&window.localStorage.setItem("cache-"+t,JSON.stringify({content:e})),r(o,e))}).catch(function(){})}}}var Fa=function(e){return parseInt(e/60/60%60,10)},Ra=function(e){return parseInt(e/60%60,10)},qa=function(e){return parseInt(e%60,10)};function Va(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!zr.number(e))return Va(null,t,n);var i=function(e){return("0"+e).slice(-2)},r=Fa(e),a=Ra(e),o=qa(e);return t||r>0?r+=":":r="",(n?"-":"")+r+i(a)+":"+i(o)}var Ba={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Sa.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=ga.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:pa.call(this,this.config.selectors.buttons.play),pause:ga.call(this,this.config.selectors.buttons.pause),restart:ga.call(this,this.config.selectors.buttons.restart),rewind:ga.call(this,this.config.selectors.buttons.rewind),fastForward:ga.call(this,this.config.selectors.buttons.fastForward),mute:ga.call(this,this.config.selectors.buttons.mute),pip:ga.call(this,this.config.selectors.buttons.pip),airplay:ga.call(this,this.config.selectors.buttons.airplay),settings:ga.call(this,this.config.selectors.buttons.settings),captions:ga.call(this,this.config.selectors.buttons.captions),fullscreen:ga.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=ga.call(this,this.config.selectors.progress),this.elements.inputs={seek:ga.call(this,this.config.selectors.inputs.seek),volume:ga.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:ga.call(this,this.config.selectors.display.buffer),currentTime:ga.call(this,this.config.selectors.display.currentTime),duration:ga.call(this,this.config.selectors.display.duration)},zr.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector("."+this.config.classNames.tooltip)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon:function(e,t){var n=Ba.getIconUrl.call(this),i=(n.cors?"":n.url)+"#"+this.config.iconPrefix,r=document.createElementNS("http://www.w3.org/2000/svg","svg");ia(r,Aa(t,{role:"presentation",focusable:"false"}));var a=document.createElementNS("http://www.w3.org/2000/svg","use"),o=i+"-"+e;return"href"in a?a.setAttributeNS("http://www.w3.org/1999/xlink","href",o):a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),r.appendChild(a),r},createLabel:function(e,t){var n=Oa(e,this.config),i=Object.assign({},t);switch(e){case"pip":n="PIP";break;case"airplay":n="AirPlay"}return"class"in i?i.class+=" "+this.config.classNames.hidden:i.class=this.config.classNames.hidden,ra("span",i,n)},createBadge:function(e){if(zr.empty(e))return null;var t=ra("span",{class:this.config.classNames.menu.value});return t.appendChild(ra("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=ra("button"),i=Object.assign({},t),r=Ca(e),a=!1,o=void 0,s=void 0,l=void 0,c=void 0;switch("type"in i||(i.type="button"),"class"in i?i.class.includes(this.config.classNames.control)&&(i.class+=" "+this.config.classNames.control):i.class=this.config.classNames.control,e){case"play":a=!0,o="play",l="pause",s="play",c="pause";break;case"mute":a=!0,o="mute",l="unmute",s="volume",c="muted";break;case"captions":a=!0,o="enableCaptions",l="disableCaptions",s="captions-off",c="captions-on";break;case"fullscreen":a=!0,o="enterFullscreen",l="exitFullscreen",s="enter-fullscreen",c="exit-fullscreen";break;case"play-large":i.class+=" "+this.config.classNames.control+"--overlaid",r="play",o="play",s="play";break;default:o=r,s=e}return a?(n.appendChild(Ba.createIcon.call(this,c,{class:"icon--pressed"})),n.appendChild(Ba.createIcon.call(this,s,{class:"icon--not-pressed"})),n.appendChild(Ba.createLabel.call(this,l,{class:"label--pressed"})),n.appendChild(Ba.createLabel.call(this,o,{class:"label--not-pressed"})),i["aria-pressed"]=!1):(n.appendChild(Ba.createIcon.call(this,s)),n.appendChild(Ba.createLabel.call(this,o))),Aa(i,ca(this.config.selectors.buttons[r],i)),ia(n,i),"play"===r?(zr.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(n)):this.elements.buttons[r]=n,n},createRange:function(e,t){var n=ra("label",{for:t.id,id:t.id+"-label",class:this.config.classNames.hidden},Oa(e,this.config)),i=ra("input",Aa(ca(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-labelledby":t.id+"-label","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,Ba.updateRangeFill.call(this,i),{label:n,input:i}},createProgress:function(e,t){var n=ra("progress",Aa(ca(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(ra("span",null,"0"));var i="";switch(e){case"played":i=Oa("played",this.config);break;case"buffer":i=Oa("buffered",this.config)}n.innerText="% "+i.toLowerCase()}return this.elements.display[e]=n,n},createTime:function(e){var t=ca(this.config.selectors.display[e]),n=ra("div",Aa(t,{class:"plyr__time "+t.class,"aria-label":Oa(e,this.config)}),"00:00");return this.elements.display[e]=n,n},createMenuItem:function(e){var t=e.value,n=e.list,i=e.type,r=e.title,a=e.badge,o=void 0===a?null:a,s=e.checked,l=void 0!==s&&s,c=ra("li"),u=ra("label",{class:this.config.classNames.control}),f=ra("input",Aa(ca(this.config.selectors.inputs[i]),{type:"radio",name:"plyr-"+i,value:t,checked:l,class:"plyr__sr-only"})),h=ra("span",{hidden:""});u.appendChild(f),u.appendChild(h),u.insertAdjacentHTML("beforeend",r),zr.element(o)&&u.appendChild(o),c.appendChild(u),n.appendChild(c)},updateTimeDisplay:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(zr.element(e)&&zr.number(t)){var i=Fa(this.duration)>0;e.innerText=Va(t,i,n)}},updateVolume:function(){this.supported.ui&&(zr.element(this.elements.inputs.volume)&&Ba.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),zr.element(this.elements.buttons.mute)&&ya(this.elements.buttons.mute,this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;zr.element(e)&&(e.value=t,Ba.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&zr.event(e)){var n,i,r=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,r=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&Ba.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=zr.number(n)?n:0,r=zr.element(e)?e:t.elements.display.buffer;if(zr.element(r)){r.value=i;var a=r.getElementsByTagName("span")[0];zr.element(a)&&(a.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=zr.event(e)?e.target:e;zr.element(t)&&"range"===t.getAttribute("type")&&(t.setAttribute("aria-valuenow",t.value),Sa.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%"))},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&zr.element(this.elements.inputs.seek)&&zr.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r=this.config.classNames.tooltip+"--visible",a=function(e){fa(t.elements.display.seekTooltip,r,e)};if(this.touch)a(!1);else{if(zr.event(e))n=100/i.width*(e.pageX-i.left);else{if(!ha(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),Ba.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left=n+"%",zr.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!zr.element(this.elements.display.duration)&&this.config.invertTime;Ba.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||Ba.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){var e=zr.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&Ba.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&Ba.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),Ba.updateSeekTooltip.call(this)}},toggleTab:function(e,t){ua(this.elements.settings.tabs[e],!t)},setQualityMenu:function(e){var t=this;if(zr.element(this.elements.settings.panes.quality)){var n=this.elements.settings.panes.quality.querySelector("ul");zr.array(e)&&(this.options.quality=Na(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!zr.empty(this.options.quality)&&this.options.quality.length>1;if(Ba.toggleTab.call(this,"quality",i),Ba.checkMenu.call(this),i){sa(n);this.options.quality.sort(function(e,n){var i=t.config.quality.options;return i.indexOf(e)>i.indexOf(n)?1:-1}).forEach(function(e){Ba.createMenuItem.call(t,{value:e,list:n,type:"quality",title:Ba.getLabel.call(t,"quality",e),badge:function(e){var n=Oa("qualityBadge."+e,t.config);return n.length?Ba.createBadge.call(t,n):null}(e)})}),Ba.updateSetting.call(this,"quality",n)}}},getLabel:function(e,t){switch(e){case"speed":return 1===t?Oa("normal",this.config):t+"×";case"quality":if(zr.number(t)){var n=Oa("qualityLabel."+t,this.config);return n.length?n:t+"p"}return La(t);case"captions":return Wa.getLabel.call(this);default:return null}},updateSetting:function(e,t,n){var i=this.elements.settings.panes[e],r=null,a=t;switch(e){case"captions":r=this.currentTrack;break;default:if(r=zr.empty(n)?this[e]:n,zr.empty(r)&&(r=this.config[e].default),!zr.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '"+r+"' for "+e);if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '"+r+"' for "+e)}if(zr.element(a)||(a=i&&i.querySelector("ul")),zr.element(a)){this.elements.settings.tabs[e].querySelector("."+this.config.classNames.menu.value).innerHTML=Ba.getLabel.call(this,e,r);var o=a&&a.querySelector('input[value="'+r+'"]');zr.element(o)&&(o.checked=!0)}},setCaptionsMenu:function(){var e=this,t=this.elements.settings.panes.captions.querySelector("ul"),n=Wa.getTracks.call(this);if(Ba.toggleTab.call(this,"captions",n.length),sa(t),Ba.checkMenu.call(this),n.length){var i=n.map(function(n,i){return{value:i,checked:e.captions.active&&e.currentTrack===i,title:Wa.getLabel.call(e,n),badge:n.language&&Ba.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});i.unshift({value:-1,checked:!this.captions.active,title:Oa("disabled",this.config),list:t,type:"language"}),i.forEach(Ba.createMenuItem.bind(this)),Ba.updateSetting.call(this,"captions",t)}},setSpeedMenu:function(e){var t=this;if(this.config.controls.includes("settings")&&this.config.settings.includes("speed")&&zr.element(this.elements.settings.panes.speed)){zr.array(e)?this.options.speed=e:(this.isHTML5||this.isVimeo)&&(this.options.speed=[.5,.75,1,1.25,1.5,1.75,2]),this.options.speed=this.options.speed.filter(function(e){return t.config.speed.options.includes(e)});var n=!zr.empty(this.options.speed)&&this.options.speed.length>1;if(Ba.toggleTab.call(this,"speed",n),Ba.checkMenu.call(this),n){var i=this.elements.settings.panes.speed.querySelector("ul");sa(i),this.options.speed.forEach(function(e){Ba.createMenuItem.call(t,{value:e,list:i,type:"speed",title:Ba.getLabel.call(t,"speed",e)})}),Ba.updateSetting.call(this,"speed",i)}}},checkMenu:function(){var e=this.elements.settings.tabs,t=!zr.empty(e)&&Object.values(e).some(function(e){return!e.hidden});ua(this.elements.settings.menu,!t)},toggleMenu:function(e){var t=this.elements.settings.form,n=this.elements.buttons.settings;if(zr.element(t)&&zr.element(n)){var i=zr.boolean(e)?e:zr.element(t)&&t.hasAttribute("hidden");if(zr.event(e)){var r=zr.element(t)&&t.contains(e.target),a=e.target===this.elements.buttons.settings;if(r||!r&&!a&&i)return;a&&e.stopPropagation()}zr.element(n)&&n.setAttribute("aria-expanded",i),zr.element(t)&&(ua(t,!i),fa(this.elements.container,this.config.classNames.menu.open,i),i?t.removeAttribute("tabindex"):t.setAttribute("tabindex",-1))}},getTabSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),Array.from(t.querySelectorAll("input[name]")).forEach(function(e){var t=e.getAttribute("name");e.setAttribute("name",t+"-clone")}),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return oa(t),{width:n,height:i}},showTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=this.elements.settings.menu,n=document.getElementById(e);if(zr.element(n)&&"tabpanel"===n.getAttribute("role")){var i=t.querySelector('[role="tabpanel"]:not([hidden])'),r=i.parentNode;if(Array.from(t.querySelectorAll('[aria-controls="'+i.getAttribute("id")+'"]')).forEach(function(e){e.setAttribute("aria-expanded",!1)}),Ea.transitions&&!Ea.reducedMotion){r.style.width=i.scrollWidth+"px",r.style.height=i.scrollHeight+"px";var a=Ba.getTabSize.call(this,n);Jr(r,ka,function(e){e.target===r&&["width","height"].includes(e.propertyName)&&(r.style.width="",r.style.height="")}),r.style.width=a.width+"px",r.style.height=a.height+"px"}ua(i,!0),i.setAttribute("tabindex",-1),ua(n,!1);var o=pa.call(this,'[aria-controls="'+e+'"]');Array.from(o).forEach(function(e){e.setAttribute("aria-expanded",!0)}),n.removeAttribute("tabindex"),n.querySelectorAll("button:not(:disabled), input:not(:disabled), [tabindex]")[0].focus()}},create:function(e){var t=this;if(zr.empty(this.config.controls))return null;var n=ra("div",ca(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(Ba.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(Ba.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(Ba.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(Ba.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=ra("div",ca(this.config.selectors.progress)),r=Ba.createRange.call(this,"seek",{id:"plyr-seek-"+e.id});if(i.appendChild(r.label),i.appendChild(r.input),i.appendChild(Ba.createProgress.call(this,"buffer")),this.config.tooltips.seek){var a=ra("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(a),this.elements.display.seekTooltip=a}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(Ba.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(Ba.createTime.call(this,"duration")),this.config.controls.includes("mute")&&n.appendChild(Ba.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o=ra("div",{class:"plyr__volume"}),s={max:1,step:.05,value:this.config.volume},l=Ba.createRange.call(this,"volume",Aa(s,{id:"plyr-volume-"+e.id}));o.appendChild(l.label),o.appendChild(l.input),this.elements.volume=o,n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(Ba.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!zr.empty(this.config.settings)){var c=ra("div",{class:"plyr__menu",hidden:""});c.appendChild(Ba.createButton.call(this,"settings",{id:"plyr-settings-toggle-"+e.id,"aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id,"aria-expanded":!1}));var u=ra("form",{class:"plyr__menu__container",id:"plyr-settings-"+e.id,hidden:"","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tablist",tabindex:-1}),f=ra("div"),h=ra("div",{id:"plyr-settings-"+e.id+"-home","aria-labelled-by":"plyr-settings-toggle-"+e.id,role:"tabpanel"}),d=ra("ul",{role:"tablist"});this.config.settings.forEach(function(n){var i=ra("li",{role:"tab",hidden:""}),r=ra("button",Aa(ca(t.config.selectors.buttons.settings),{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--forward",id:"plyr-settings-"+e.id+"-"+n+"-tab","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-"+n,"aria-expanded":!1}),Oa(n,t.config)),a=ra("span",{class:t.config.classNames.menu.value});a.innerHTML=e[n],r.appendChild(a),i.appendChild(r),d.appendChild(i),t.elements.settings.tabs[n]=i}),h.appendChild(d),f.appendChild(h),this.config.settings.forEach(function(n){var i=ra("div",{id:"plyr-settings-"+e.id+"-"+n,hidden:"","aria-labelled-by":"plyr-settings-"+e.id+"-"+n+"-tab",role:"tabpanel",tabindex:-1}),r=ra("button",{type:"button",class:t.config.classNames.control+" "+t.config.classNames.control+"--back","aria-haspopup":!0,"aria-controls":"plyr-settings-"+e.id+"-home","aria-expanded":!1},Oa(n,t.config));i.appendChild(r);var a=ra("ul");i.appendChild(a),f.appendChild(i),t.elements.settings.panes[n]=i}),u.appendChild(f),c.appendChild(u),n.appendChild(c),this.elements.settings.form=u,this.elements.settings.menu=c}return this.config.controls.includes("pip")&&Ea.pip&&n.appendChild(Ba.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Ea.airplay&&n.appendChild(Ba.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(Ba.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(Ba.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&Ba.setQualityMenu.call(this,_a.getQualityOptions.call(this)),Ba.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=Ba.getIconUrl.call(this);t.cors&&Ia(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var i={id:this.id,seektime:this.config.seekTime,title:this.config.title},r=!0;zr.string(this.config.controls)||zr.element(this.config.controls)?n=this.config.controls:zr.function(this.config.controls)?n=this.config.controls.call(this,i):(n=Ba.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Wa.getLabel.call(this)}),r=!1);var a=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=ta(e,2),i=n[0],r=n[1];t=Ma(t,"{"+i+"}",r)}),t};r&&(zr.string(this.config.controls)?n=a(n):zr.element(n)&&(n.innerHTML=a(n.innerHTML)));var o,s=void 0;if(zr.string(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),zr.element(s)||(s=this.elements.container),zr.element(n)?s.appendChild(n):n&&s.insertAdjacentHTML("beforeend",n),zr.element(this.elements.controls)||Ba.findElements.call(this),window.navigator.userAgent.includes("Edge")&&(o=s,setTimeout(function(){ua(o,!0),o.offsetHeight,ua(o,!1)},0)),this.config.tooltips.controls){var l=pa.call(this,[this.config.selectors.controls.wrapper," ",this.config.selectors.labels," .",this.config.classNames.hidden].join(""));Array.from(l).forEach(function(t){fa(t,e.config.classNames.hidden,!1),fa(t,e.config.classNames.tooltip,!0),t.setAttribute("role","tooltip")})}}};function Da(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var r=new XMLHttpRequest;if(!("withCredentials"in r))return;r.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(r.responseText))}catch(e){n(r.responseText)}else n(r.response)}),r.addEventListener("error",function(){throw new Error(r.statusText)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function Ua(e){var t=e;if(!(arguments.length>1&&void 0!==arguments[1])||arguments[1]){var n=document.createElement("a");n.href=t,t=n.href}try{return new URL(t)}catch(e){return null}}function Ha(e){if(!zr.object(e))return"";var t=new URLSearchParams;return Object.entries(e).forEach(function(e){var n=ta(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var Wa={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Ea.textTracks)zr.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&Ba.setCaptionsMenu.call(this);else{var e,t;if(zr.element(this.elements.captions)||(this.elements.captions=ra("div",ca(this.config.selectors.captions)),e=this.elements.captions,(t=this.elements.wrapper).parentNode.insertBefore(e,t.nextSibling)),Sa.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=Ua(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Da(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){oa(e)})})}var i=this.storage.get("captions");zr.boolean(i)||(i=this.config.captions.active);var r=this.storage.get("language")||this.config.captions.language;if("auto"===r){var a=(navigator.language||navigator.userLanguage).split("-");r=ta(a,1)[0]}if(Wa.setLanguage.call(this,r,i),this.isHTML5){var o=this.config.captions.update?"addtrack removetrack":"removetrack";Yr.call(this,this.media.textTracks,o,Wa.update.bind(this))}setTimeout(Wa.update.bind(this),0)}},update:function(){var e=this,t=Wa.getTracks.call(this,!0),n=this.captions,i=n.language,r=n.meta;this.isHTML5&&this.isVideo&&t.filter(function(e){return!r.get(e)}).forEach(function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),t.mode="hidden",Yr.call(e,t,"cuechange",function(){return Wa.updateCues.call(e)})});var a=!t.find(function(t){return t===e.captions.currentTrackNode}),o=this.language!==i&&t.find(function(e){return e.language===i});(a||o)&&Wa.setLanguage.call(this,i,this.config.captions.active),fa(this.elements.container,this.config.classNames.captions.enabled,!zr.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&Ba.setCaptionsMenu.call(this)},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=Wa.getTracks.call(this);if(-1!==e)if(zr.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=Wa.getCurrentTrack.call(this),a=(r||{}).language;this.captions.currentTrackNode=r,t&&(this.captions.language=a),this.isVimeo&&this.embed.enableTextTrack(a),$r.call(this,this.media,"languagechange")}this.isHTML5&&this.isVideo&&Wa.updateCues.call(this),n&&this.toggleCaptions(!0)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else this.toggleCaptions(!1)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(zr.string(e)){this.captions.language=e.toLowerCase();var n=Wa.getTracks.call(this),i=Wa.getCurrentTrack.call(this,!0);Wa.set.call(this,n.indexOf(i),!1,t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Array.from((this.media||{}).textTracks||[]).filter(function(n){return!e.isHTML5||t||e.captions.meta.has(n)}).filter(function(e){return["captions","subtitles"].includes(e.kind)})},getCurrentTrack:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Wa.getTracks.call(this),i=function(t){return Number((e.captions.meta.get(t)||{}).default)},r=Array.from(n).sort(function(e,t){return i(t)-i(e)});return!t&&n[this.currentTrack]||r.find(function(t){return t.language===e.captions.language})||r[0]},getLabel:function(e){var t=e;return!zr.track(t)&&Ea.textTracks&&this.captions.active&&(t=Wa.getCurrentTrack.call(this)),zr.track(t)?zr.empty(t.label)?zr.empty(t.language)?Oa("enabled",this.config):e.language.toUpperCase():t.label:Oa("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(zr.element(this.elements.captions))if(zr.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=Wa.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(xa)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){sa(this.elements.captions);var r=ra("span",ca(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),$r.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},za={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:"16:9",clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.3.12/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240,"default"]},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/v2/video/{0}.json"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","qualityrequested","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption",menu:{quality:".js-plyr__menu__list--quality"}},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus"},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},keys:{google:null},ads:{enabled:!1,publisherId:""}},Ga={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Ka={audio:"audio",video:"video"};var Ya=function(){},Qa=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xr(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return Zr(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Ya}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Ya}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Ya}}]),e}();function Ja(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;zr.element(e)&&ya(e,this.active),$r.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Sa.isIos||function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(zr.element(e)){var n=pa.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1],a=function(e){if("Tab"===e.key&&9===e.keyCode){var t=ma();t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}};t?Yr(this.elements.container,"keydown",a,!1):Qr(this.elements.container,"keydown",a,!1)}}.call(this.player,this.target,this.active)}}function $a(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",fa(this.target,this.player.config.classNames.fullscreen.fallback,e),Ja.call(this)}var Xa=function(){function e(t){var n=this;Xr(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},Yr.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":this.prefix+"fullscreenchange",function(){Ja.call(n)}),Yr.call(this.player,this.player.elements.container,"dblclick",function(e){zr.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return Zr(e,[{key:"update",value:function(){this.enabled?this.player.debug.log((e.native?"Native":"Fallback")+" fullscreen enabled"):this.player.debug.log("Fullscreen not supported and fallback disabled"),fa(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Sa.isIos&&this.player.config.fullscreen.iosNative?this.player.playing&&this.target.webkitEnterFullscreen():e.native?this.prefix?zr.empty(this.prefix)||this.target[this.prefix+"Request"+this.property]():this.target.requestFullscreen():$a.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(Sa.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!zr.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document[""+this.prefix+t+this.property]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else $a.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(e.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}},{key:"active",get:function(){return!!this.enabled&&(e.native?(this.prefix?document[""+this.prefix+this.property+"Element"]:document.fullscreenElement)===this.target:ha(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return Sa.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(zr.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!zr.function(document[t+"ExitFullscreen"])&&!zr.function(document[t+"CancelFullScreen"]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function Za(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var r=new Image,a=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:a,onerror:a,src:e})})}var eo={addStyleHook:function(){fa(this.elements.container,this.config.selectors.container.replace(".",""),!0),fa(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build:function(){var e=this;if(this.listeners.media(),!this.supported.ui)return this.debug.warn("Basic support only for "+this.provider+" "+this.type),void eo.toggleNativeControls.call(this,!0);zr.element(this.elements.controls)||(Ba.inject.call(this),this.listeners.controls()),eo.toggleNativeControls.call(this),this.isHTML5&&Wa.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,Ba.updateVolume.call(this),Ba.timeUpdate.call(this),eo.checkPlaying.call(this),fa(this.elements.container,this.config.classNames.pip.supported,Ea.pip&&this.isHTML5&&this.isVideo),fa(this.elements.container,this.config.classNames.airplay.supported,Ea.airplay&&this.isHTML5),fa(this.elements.container,this.config.classNames.isIos,Sa.isIos),fa(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){$r.call(e,e.media,"ready")},0),eo.setTitle.call(this),this.poster&&this.elements.poster&&!this.elements.poster.style.backgroundImage&&eo.setPoster.call(this,this.poster),this.config.duration&&Ba.durationUpdate.call(this)},setTitle:function(){var e=Oa("play",this.config);if(zr.string(this.config.title)&&!zr.empty(this.config.title)&&(e+=", "+this.config.title,this.elements.container.setAttribute("aria-label",this.config.title)),zr.nodeList(this.elements.buttons.play)&&Array.from(this.elements.buttons.play).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=ga.call(this,"iframe");if(!zr.element(t))return;var n=zr.empty(this.config.title)?"video":this.config.title,i=Oa("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){fa(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;if(this.media.setAttribute("poster",e),!zr.element(this.elements.poster))return Promise.reject();var n=Za(e).then(function(){return t.elements.poster.style.backgroundImage="url('"+e+"')",Object.assign(t.elements.poster.style,{backgroundImage:"url('"+e+"')",backgroundSize:""}),eo.togglePoster.call(t,!0),e});return n.catch(function(){return eo.togglePoster.call(t,!1)}),n},checkPlaying:function(e){fa(this.elements.container,this.config.classNames.playing,this.playing),fa(this.elements.container,this.config.classNames.paused,this.paused),fa(this.elements.container,this.config.classNames.stopped,this.stopped),ya(this.elements.buttons.play,this.playing),zr.event(e)&&"timeupdate"===e.type||eo.toggleControls.call(this)},checkLoading:function(e){var t=this;this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(function(){fa(t.elements.container,t.config.classNames.loading,t.loading),eo.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;t&&this.config.hideControls&&this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover))}},to=function(){function e(t){Xr(this,e),this.player=t,this.lastKey=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}return Zr(e,[{key:"handleKey",value:function(e){var t=this,n=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,r=i&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&zr.number(n)){if(i){var a=ma();if(zr.element(a)&&a!==this.player.elements.inputs.seek&&da(a,this.player.config.selectors.editable))return;switch([48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67,73,76,79].includes(n)&&(e.preventDefault(),e.stopPropagation()),n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:r||(t.player.currentTime=t.player.duration/10*(n-48));break;case 32:case 75:r||this.player.togglePlay();break;case 38:this.player.increaseVolume(.1);break;case 40:this.player.decreaseVolume(.1);break;case 77:r||(this.player.muted=!this.player.muted);break;case 39:this.player.forward();break;case 37:this.player.rewind();break;case 70:this.player.fullscreen.toggle();break;case 67:r||this.player.toggleCaptions();break;case 76:this.player.loop=!this.player.loop}!this.player.fullscreen.enabled&&this.player.fullscreen.active&&27===n&&this.player.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){Ba.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){this.player.touch=!0,fa(this.player.elements.container,this.player.config.classNames.isTouch,!0)}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.player.config.keyboard.global&&Kr.call(this.player,window,"keydown keyup",this.handleKey,e,!1),Kr.call(this.player,document.body,"click",this.toggleMenu,e),Jr(document.body,"touchstart",this.firstTouch)}},{key:"container",value:function(){var e=this;!this.player.config.keyboard.global&&this.player.config.keyboard.focused&&Yr.call(this.player,this.player.elements.container,"keydown keyup",this.handleKey,!1),Yr.call(this.player,this.player.elements.container,"focusout",function(t){fa(t.target,e.player.config.classNames.tabFocus,!1)}),Yr.call(this.player,this.player.elements.container,"keydown",function(t){9===t.keyCode&&setTimeout(function(){fa(ma(),e.player.config.classNames.tabFocus,!0)},0)}),Yr.call(this.player,this.player.elements.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(t){var n=e.player.elements.controls;"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var i=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(eo.toggleControls.call(e.player,!0),i=e.player.touch?3e3:2e3),clearTimeout(e.player.timers.controls),e.player.timers.controls=setTimeout(function(){return eo.toggleControls.call(e.player,!1)},i)})}},{key:"media",value:function(){var e=this;if(Yr.call(this.player,this.player.media,"timeupdate seeking seeked",function(t){return Ba.timeUpdate.call(e.player,t)}),Yr.call(this.player,this.player.media,"durationchange loadeddata loadedmetadata",function(t){return Ba.durationUpdate.call(e.player,t)}),Yr.call(this.player,this.player.media,"loadeddata",function(){ua(e.player.elements.volume,!e.player.hasAudio),ua(e.player.elements.buttons.mute,!e.player.hasAudio)}),Yr.call(this.player,this.player.media,"ended",function(){e.player.isHTML5&&e.player.isVideo&&e.player.config.resetOnEnd&&e.player.restart()}),Yr.call(this.player,this.player.media,"progress playing seeking seeked",function(t){return Ba.updateProgress.call(e.player,t)}),Yr.call(this.player,this.player.media,"volumechange",function(t){return Ba.updateVolume.call(e.player,t)}),Yr.call(this.player,this.player.media,"playing play pause ended emptied timeupdate",function(t){return eo.checkPlaying.call(e.player,t)}),Yr.call(this.player,this.player.media,"waiting canplay seeked playing",function(t){return eo.checkLoading.call(e.player,t)}),Yr.call(this.player,this.player.media,"playing",function(){e.player.ads&&e.player.ads.enabled&&!e.player.ads.initialized&&e.player.ads.managerPromise.then(function(){return e.player.ads.play()}).catch(function(){return e.player.play()})}),this.player.supported.ui&&this.player.config.clickToPlay&&!this.player.isAudio){var t=ga.call(this.player,"."+this.player.config.classNames.video);if(!zr.element(t))return;Yr.call(this.player,t,"click",function(){e.player.config.hideControls&&e.player.touch&&!e.player.paused||(e.player.paused?e.player.play():e.player.ended?(e.player.restart(),e.player.play()):e.player.pause())})}this.player.supported.ui&&this.player.config.disableContextMenu&&Yr.call(this.player,this.player.elements.wrapper,"contextmenu",function(e){e.preventDefault()},!1),Yr.call(this.player,this.player.media,"volumechange",function(){e.player.storage.set({volume:e.player.volume,muted:e.player.muted})}),Yr.call(this.player,this.player.media,"ratechange",function(){Ba.updateSetting.call(e.player,"speed"),e.player.storage.set({speed:e.player.speed})}),Yr.call(this.player,this.player.media,"qualityrequested",function(t){e.player.storage.set({quality:t.detail.quality})}),Yr.call(this.player,this.player.media,"qualitychange",function(t){Ba.updateSetting.call(e.player,"quality",null,t.detail.quality)}),Yr.call(this.player,this.player.media,"languagechange",function(){Ba.updateSetting.call(e.player,"captions"),e.player.storage.set({language:e.player.language})}),Yr.call(this.player,this.player.media,"captionsenabled captionsdisabled",function(){Ba.updateSetting.call(e.player,"captions"),e.player.storage.set({captions:e.player.captions.active})}),Yr.call(this.player,this.player.media,this.player.config.events.concat(["keyup","keydown"]).join(" "),function(t){var n=t.detail,i=void 0===n?{}:n;"error"===t.type&&(i=e.player.media.error),$r.call(e.player,e.player.elements.container,t.type,!0,i)})}},{key:"controls",value:function(){var e=this,t=Sa.isIE?"change":"input",n=function(t,n,i){var r=e.player.config.listeners[i],a=!0;zr.function(r)&&(a=r.call(e.player,t)),a&&zr.function(n)&&n.call(e.player,t)},i=function(t,i,r,a){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=e.player.config.listeners[a],l=zr.function(s);Yr.call(e.player,t,i,function(e){return n(e,r,a)},o&&!l)};i(this.player.elements.buttons.play,"click",this.player.togglePlay,"play"),i(this.player.elements.buttons.restart,"click",this.player.restart,"restart"),i(this.player.elements.buttons.rewind,"click",this.player.rewind,"rewind"),i(this.player.elements.buttons.fastForward,"click",this.player.forward,"fastForward"),i(this.player.elements.buttons.mute,"click",function(){e.player.muted=!e.player.muted},"mute"),i(this.player.elements.buttons.captions,"click",this.player.toggleCaptions),i(this.player.elements.buttons.fullscreen,"click",function(){e.player.fullscreen.toggle()},"fullscreen"),i(this.player.elements.buttons.pip,"click",function(){e.player.pip="toggle"},"pip"),i(this.player.elements.buttons.airplay,"click",this.player.airplay,"airplay"),i(this.player.elements.buttons.settings,"click",function(t){Ba.toggleMenu.call(e.player,t)}),i(this.player.elements.settings.form,"click",function(t){t.stopPropagation();var i=function(){var t="plyr-settings-"+e.player.id+"-home";Ba.showTab.call(e.player,t)};if(da(t.target,e.player.config.selectors.inputs.language))n(t,function(){e.player.currentTrack=Number(t.target.value),i()},"language");else if(da(t.target,e.player.config.selectors.inputs.quality))n(t,function(){e.player.quality=t.target.value,i()},"quality");else if(da(t.target,e.player.config.selectors.inputs.speed))n(t,function(){e.player.speed=parseFloat(t.target.value),i()},"speed");else{var r=t.target;Ba.showTab.call(e.player,r.getAttribute("aria-controls"))}}),i(this.player.elements.inputs.seek,"mousedown mousemove",function(t){var n=e.player.elements.progress.getBoundingClientRect(),i=100/n.width*(t.pageX-n.left);t.currentTarget.setAttribute("seek-value",i)}),i(this.player.elements.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r=t.type;if("keydown"!==r&&"keyup"!==r||39===i||37===i){var a=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(t.type);a&&o?(n.removeAttribute("play-on-seeked"),e.player.play()):!o&&e.player.playing&&(n.setAttribute("play-on-seeked",""),e.player.pause())}}),i(this.player.elements.inputs.seek,t,function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");zr.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),e.player.currentTime=i/n.max*e.player.duration},"seek"),this.player.config.toggleInvert&&!zr.element(this.player.elements.display.duration)&&i(this.player.elements.display.currentTime,"click",function(){0!==e.player.currentTime&&(e.player.config.invertTime=!e.player.config.invertTime,Ba.timeUpdate.call(e.player))}),i(this.player.elements.inputs.volume,t,function(t){e.player.volume=t.target.value},"volume"),Sa.isWebkit&&i(pa.call(this.player,'input[type="range"]'),"input",function(t){Ba.updateRangeFill.call(e.player,t.target)}),i(this.player.elements.progress,"mouseenter mouseleave mousemove",function(t){return Ba.updateSeekTooltip.call(e.player,t)}),i(this.player.elements.controls,"mouseenter mouseleave",function(t){e.player.elements.controls.hover=!e.player.touch&&"mouseenter"===t.type}),i(this.player.elements.controls,"mousedown mouseup touchstart touchend touchcancel",function(t){e.player.elements.controls.pressed=["mousedown","touchstart"].includes(t.type)}),i(this.player.elements.controls,"focusin focusout",function(t){var n=e.player,i=n.config,r=n.elements,a=n.timers;if(fa(r.controls,i.classNames.noTransition,"focusin"===t.type),eo.toggleControls.call(e.player,"focusin"===t.type),"focusin"===t.type){setTimeout(function(){fa(r.controls,i.classNames.noTransition,!1)},0);var o=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout(function(){return eo.toggleControls.call(e.player,!1)},o)}}),i(this.player.elements.inputs.volume,"wheel",function(t){var n=t.webkitDirectionInvertedFromDevice,i=0;(t.deltaY<0||t.deltaX>0)&&(n?(e.player.decreaseVolume(.02),i=-1):(e.player.increaseVolume(.02),i=1)),(t.deltaY>0||t.deltaX<0)&&(n?(e.player.increaseVolume(.02),i=1):(e.player.decreaseVolume(.02),i=-1)),(1===i&&e.player.media.volume<1||-1===i&&e.player.media.volume>0)&&t.preventDefault()},"volume",!1)}}]),e}(),no=t(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function r(e,t){if(e){var r=i[e];if(n[e]=t,r)for(;r.length;)r[0](e,t),r.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,r){var a,s,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(t)?(a=!0,(s=l.createElement("link")).rel="stylesheet",s.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(s=l.createElement("img")).src=h:((s=l.createElement("script")).src=t,s.async=void 0===c||c),s.onload=s.onerror=s.onbeforeload=function(e){var l=e.type[0];if(a&&"hideFocus"in s)try{s.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(r+=1)<u)return o(t,n,i,r);n(t,l,e.defaultPrevented)},!1!==f(t,s)&&l.head.appendChild(s)}function s(e,n,i){var s,l;if(n&&n.trim&&(s=n),l=(s?i:n)||{},s){if(s in t)throw"LoadJS";t[s]=!0}!function(e,t,n){var i,r,a=(e=e.push?e:[e]).length,s=a,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--a||t(l)},r=0;r<s;r++)o(e[r],i,n)}(e,function(e){a(l,e),r(s,e)},l)}return s.ready=function(e,t){return function(e,t){e=e.push?e:[e];var r,a,o,s=[],l=e.length,c=l;for(r=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)a=e[l],(o=n[a])?r(a,o):(i[a]=i[a]||[]).push(r)}(e,function(e){a(t,e)}),s},s.done=function(e){r(e,[])},s.reset=function(){t={},n={},i={}},s.isDefined=function(e){return e in t},s},e.exports=n()});function io(e){return new Promise(function(t,n){no(e,{success:t,error:n})})}function ro(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,$r.call(this,this.media,e?"play":"pause"))}var ao={setup:function(){var e=this;fa(this.elements.wrapper,this.config.classNames.embed,!0),ao.setAspectRatio.call(this),zr.object(window.Vimeo)?ao.ready.call(this):io(this.config.urls.vimeo.sdk).then(function(){ao.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=zr.string(e)?e.split(":"):this.config.ratio.split(":"),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom=n+"%",this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-"+i+"%)"}},ready:function(){var e=this,t=this,n=Ha({loop:t.config.loop.active,autoplay:t.autoplay,byline:!1,portrait:!1,title:!1,speed:!0,transparent:0,gesture:"media",playsinline:!this.config.fullscreen.iosNative}),i=t.media.getAttribute("src");zr.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,a=(r=i,zr.empty(r)?null:zr.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),o=ra("iframe"),s=Pa(t.config.urls.vimeo.iframe,a,n);o.setAttribute("src",s),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var l=ra("div",{class:t.config.classNames.embedContainer});l.appendChild(o),t.media=la(l,t.media),Da(Pa(t.config.urls.vimeo.api,a),"json").then(function(e){if(!zr.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname=n.pathname.split("_")[0]+".jpg",eo.setPoster.call(t,n.href)}}),t.embed=new window.Vimeo.Player(o,{autopause:t.config.autopause,muted:t.muted}),t.media.paused=!0,t.media.currentTime=0,t.supported.ui&&t.embed.disableTextTrack(),t.media.play=function(){return ro.call(t,!0),t.embed.play()},t.media.pause=function(){return ro.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var c=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return c},set:function(e){var n=t.embed,i=t.media,r=t.paused,a=t.volume,o=r&&!n.hasPlayed;i.seeking=!0,$r.call(t,i,"seeking"),Promise.resolve(o&&n.setVolume(0)).then(function(){return n.setCurrentTime(e)}).then(function(){return o&&n.pause()}).then(function(){return o&&n.setVolume(a)}).catch(function(){})}});var u=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return u},set:function(e){t.embed.setPlaybackRate(e).then(function(){u=e,$r.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&Ba.setSpeedMenu.call(t,[])})}});var f=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return f},set:function(e){t.embed.setVolume(e).then(function(){f=e,$r.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!zr.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,$r.call(t,t.media,"volumechange")})}});var d=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return d},set:function(e){var n=zr.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){d=n})}});var p=void 0;t.embed.getVideoUrl().then(function(e){p=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return p}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then(function(t){var n=function(e,t){var n=function e(t,n){return 0===n?t:e(n,t%n)}(e,t);return e/n+":"+t/n}(t[0],t[1]);ao.setAspectRatio.call(e,n)}),t.embed.setAutopause(t.config.autopause).then(function(e){t.config.autopause=e}),t.embed.getVideoTitle().then(function(n){t.config.title=n,eo.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,$r.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,$r.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,Wa.setup.call(t)}),t.embed.on("cuechange",function(e){var n=e.cues,i=(void 0===n?[]:n).map(function(e){return t=e.text,n=document.createDocumentFragment(),i=document.createElement("div"),n.appendChild(i),i.innerHTML=t,n.firstChild.innerText;var t,n,i});Wa.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){ro.call(t,!e),e||$r.call(t,t.media,"playing")}),zr.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){ro.call(t,!0),$r.call(t,t.media,"playing")}),t.embed.on("pause",function(){ro.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,$r.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,$r.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&$r.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,$r.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,$r.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,$r.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,$r.call(t,t.media,"error")}),setTimeout(function(){return eo.build.call(t)},0)}};function oo(e){var t=Object.entries({hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144}).find(function(t){return t.includes(e)});return t?t.find(function(t){return t!==e}):"default"}function so(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,$r.call(this,this.media,e?"play":"pause"))}var lo,co={setup:function(){var e=this;fa(this.elements.wrapper,this.config.classNames.embed,!0),co.setAspectRatio.call(this),zr.object(window.YT)&&zr.function(window.YT.Player)?co.ready.call(this):(io(this.config.urls.youtube.sdk).catch(function(t){e.debug.warn("YouTube API failed to load",t)}),window.onYouTubeReadyCallbacks=window.onYouTubeReadyCallbacks||[],window.onYouTubeReadyCallbacks.push(function(){co.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(zr.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(zr.empty(n))return this.config.title=n,void eo.setTitle.call(this)}var i=this.config.keys.google;zr.string(i)&&!zr.empty(i)&&Da(Pa(this.config.urls.youtube.api,e,i)).then(function(e){zr.object(e)&&(t.config.title=e.items[0].snippet.title,eo.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom=100/e[0]*e[1]+"%"},ready:function(){var e=this,t=e.media.getAttribute("id");if(zr.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");zr.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r=(i=n,zr.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),a=e.provider+"-"+Math.floor(1e4*Math.random()),o=ra("div",{id:a});e.media=la(o,e.media);var s=function(e){return"https://img.youtube.com/vi/"+r+"/"+e+"default.jpg"};Za(s("maxres"),121).catch(function(){return Za(s("sd"),121)}).catch(function(){return Za(s("hq"))}).then(function(t){return eo.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}),e.embed=new window.YT.Player(a,{videoId:r,playerVars:{autoplay:e.config.autoplay?1:0,controls:e.supported.ui?0:1,rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,disablekb:1,playsinline:1,widget_referrer:window?window.location.href:null,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language},events:{onError:function(t){if(!zr.object(e.media.error)){var n={code:t.data};switch(t.data){case 2:n.message="The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.";break;case 5:n.message="The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.";break;case 100:n.message="The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.";break;case 101:case 150:n.message="The owner of the requested video does not allow it to be played in embedded players.";break;default:n.message="An unknown error occured"}e.media.error=n,$r.call(e,e.media,"error")}},onPlaybackQualityChange:function(){$r.call(e,e.media,"qualitychange",!1,{quality:e.media.quality})},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),$r.call(e,e.media,"ratechange")},onReady:function(t){var n=t.target;co.getTitle.call(e,r),e.media.play=function(){so.call(e,!0),n.playVideo()},e.media.pause=function(){so.call(e,!1),n.pauseVideo()},e.media.stop=function(){n.stopVideo()},e.media.duration=n.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(n.getCurrentTime())},set:function(t){e.paused&&e.embed.mute(),e.media.seeking=!0,$r.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}}),Object.defineProperty(e.media,"quality",{get:function(){return oo(n.getPlaybackQuality())},set:function(e){n.setPlaybackQuality(oo(e))}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),$r.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var i=zr.boolean(t)?t:a;a=i,n[i?"mute":"unMute"](),$r.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return n.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}}),e.options.speed=n.getAvailablePlaybackRates(),e.supported.ui&&e.media.setAttribute("tabindex",-1),$r.call(e,e.media,"timeupdate"),$r.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(function(){e.media.buffered=n.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&$r.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),$r.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return eo.build.call(e)},50)},onStateChange:function(t){var n,i=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,$r.call(e,e.media,"seeked")),t.data){case-1:$r.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),$r.call(e,e.media,"progress");break;case 0:so.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):$r.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(so.call(e,!0),$r.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){$r.call(e,e.media,"timeupdate")},50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),$r.call(e,e.media,"durationchange")),Ba.setQualityMenu.call(e,(n=i.getAvailableQualityLevels(),zr.empty(n)?n:Na(n.map(function(e){return oo(e)})))));break;case 2:e.muted||e.embed.unMute(),so.call(e,!1)}$r.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},uo={setup:function(){if(this.media)if(fa(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),fa(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&fa(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=ra("div",{class:this.config.classNames.video}),na(this.media,this.elements.wrapper),this.elements.poster=ra("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isEmbed)switch(this.provider){case"youtube":co.setup.call(this);break;case"vimeo":ao.setup.call(this)}else this.isHTML5&&_a.extend.call(this);else this.debug.warn("No media element found!")}},fo=function(){function e(t){var n=this;Xr(this,e),this.player=t,this.publisherId=t.config.ads.publisherId,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(function(e,t){n.on("loaded",e),n.on("error",t)}),this.load()}return Zr(e,[{key:"load",value:function(){var e=this;this.enabled&&(zr.object(window.google)&&zr.object(window.google.ima)?this.ready():io(this.player.config.urls.googleIMA.sdk).then(function(){e.ready()}).catch(function(){e.trigger("error",new Error("Google IMA SDK failed to load"))}))}},{key:"ready",value:function(){var e=this;this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(function(){e.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){this.elements.container=ra("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container),this.requestAds()}},{key:"requestAds",value:function(){var e=this,t=this.player.elements.container;try{this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,function(t){return e.onAdsManagerLoaded(t)},!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(t){return e.onAdError(t)},!1);var n=new google.ima.AdsRequest;n.adTagUrl=this.tagUrl,n.linearAdSlotWidth=t.offsetWidth,n.linearAdSlotHeight=t.offsetHeight,n.nonLinearAdSlotWidth=t.offsetWidth,n.nonLinearAdSlotHeight=t.offsetHeight,n.forceNonLinearFullSlot=!1,n.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(n)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this;if(!(arguments.length>0&&void 0!==arguments[0]&&arguments[0]))return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval(function(){var t=Va(Math.max(e.manager.getRemainingTime(),0)),n=Oa("advertisement",e.player.config)+" - "+t;e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this,n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),zr.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(zr.element(n)){var i=100/t.player.duration*e,r=ra("span",{class:t.player.config.classNames.cues});r.style.left=i.toString()+"%",n.appendChild(r)}}}),this.manager.setVolume(this.player.volume),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,function(e){return t.onAdError(e)}),Object.keys(google.ima.AdEvent.Type).forEach(function(e){t.manager.addEventListener(google.ima.AdEvent.Type[e],function(e){return t.onAdEvent(e)})}),this.trigger("loaded")}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=function(e){var n="ads"+e.replace(/_/g,"").toLowerCase();$r.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),r(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:r(e.type),this.loadAds();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:r(e.type),this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:r(e.type),this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.STARTED:case google.ima.AdEvent.Type.MIDPOINT:case google.ima.AdEvent.Type.COMPLETE:case google.ima.AdEvent.Type.IMPRESSION:case google.ima.AdEvent.Type.CLICK:r(e.type)}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e=this,t=this.player.elements.container,n=void 0;this.player.on("ended",function(){e.loader.contentComplete()}),this.player.on("seeking",function(){return n=e.player.currentTime}),this.player.on("seeked",function(){var t=e.player.currentTime;zr.empty(e.cuePoints)||e.cuePoints.forEach(function(i,r){n<i&&i<t&&(e.manager.discardAdBreak(),e.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){e.manager&&e.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)})}},{key:"play",value:function(){var e=this,t=this.player.elements.container;this.managerPromise||this.resumeContent(),this.managerPromise.then(function(){e.elements.displayContainer.initialize();try{e.initialized||(e.manager.init(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL),e.manager.start()),e.initialized=!0}catch(t){e.onAdError(t)}}).catch(function(){})}},{key:"resumeContent",value:function(){this.elements.container.style.zIndex="",this.playing=!1,this.player.currentTime<this.player.duration&&this.player.play()}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.pause()}},{key:"cancel",value:function(){this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}},{key:"loadAds",value:function(){var e=this;this.managerPromise.then(function(){e.manager&&e.manager.destroy(),e.managerPromise=new Promise(function(t){e.on("loaded",t),e.player.debug.log(e.manager)}),e.requestAds()}).catch(function(){})}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,i=Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var a=this.events[e];zr.array(a)&&a.forEach(function(e){zr.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return zr.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this}},{key:"startSafetyTimer",value:function(e,t){var n=this;this.player.debug.log("Safety timer invoked from: "+t),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){zr.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: "+e),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isVideo&&this.player.config.ads.enabled&&!zr.empty(this.publisherId)}},{key:"tagUrl",get:function(){return"https://go.aniview.com/api/adserver6/vast/?"+Ha({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId})}}]),e}(),ho={insertElements:function(e,t){var n=this;zr.string(t)?aa(e,this.media,{src:t}):zr.array(t)&&t.forEach(function(t){aa(e,n.media,t)})},change:function(e){var t=this;zr.object(e)&&"sources"in e&&e.sources.length?(_a.cancelRequests.call(this),this.destroy.call(this,function(){switch(t.options.quality=[],oa(t.media),t.media=null,zr.element(t.elements.container)&&t.elements.container.removeAttribute("class"),t.type=e.type,t.provider=zr.empty(e.sources[0].provider)?Ga.html5:e.sources[0].provider,t.supported=Ea.check(t.type,t.provider,t.config.playsinline),t.provider+":"+t.type){case"html5:video":t.media=ra("video");break;case"html5:audio":t.media=ra("audio");break;case"youtube:video":case"vimeo:video":t.media=ra("div",{src:e.sources[0].src})}t.elements.container.appendChild(t.media),zr.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),zr.empty(e.poster)||(t.poster=e.poster),t.config.loop.active&&t.media.setAttribute("loop",""),t.config.muted&&t.media.setAttribute("muted",""),t.config.playsinline&&t.media.setAttribute("playsinline","")),eo.addStyleHook.call(t),t.isHTML5&&ho.insertElements.call(t,"source",e.sources),t.config.title=e.title,uo.setup.call(t),t.isHTML5&&("tracks"in e&&ho.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&eo.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},po=function(){function e(t,n){var i=this;if(Xr(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Ea.touch,this.media=t,zr.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||zr.nodeList(this.media)||zr.array(this.media))&&(this.media=this.media[0]),this.config=Aa({},za,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,buttons:{},display:{},progress:{},inputs:{},settings:{menu:null,panes:{},tabs:{}},captions:null},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Qa(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Ea),!zr.nullOrUndefined(this.media)&&zr.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Ea.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var a=this.media.tagName.toLowerCase(),o=null,s=null;switch(a){case"div":if(o=this.media.querySelector("iframe"),zr.element(o)){if(s=Ua(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Ga.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Ga.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",s.searchParams.length){var l=["1","true"];l.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?this.config.playsinline=l.includes(s.searchParams.get("playsinline")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(zr.empty(this.provider)||!Object.keys(Ga).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Ka.video;break;case"video":case"audio":this.type=a,this.provider=Ga.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),this.media.hasAttribute("playsinline")&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=Ea.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new to(this),this.storage=new ja(this),this.media.plyr=this,zr.element(this.elements.container)||(this.elements.container=ra("div"),na(this.media,this.elements.container)),this.elements.container.setAttribute("tabindex",0),eo.addStyleHook.call(this),uo.setup.call(this),this.config.debug&&Yr.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: "+e.type)}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&eo.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Xa(this),this.ads=new fo(this),this.config.autoplay&&this.play()):this.debug.error("Setup failed: no support")}else this.debug.error("Setup failed: no support");else this.debug.error("Setup failed: disabled by config");else this.debug.error("Setup failed: no suitable element passed")}return Zr(e,[{key:"play",value:function(){return zr.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&zr.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(zr.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):zr.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(zr.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(zr.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(zr.number(e)?e:1)}},{key:"decreaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t-(zr.number(e)?e:1)}},{key:"toggleCaptions",value:function(e){if(this.supported.ui){var t=zr.boolean(e)?e:!this.elements.container.classList.contains(this.config.classNames.captions.active);ya(this.elements.buttons.captions,t),fa(this.elements.container,this.config.classNames.captions.active,t),t!==this.captions.active&&(this.captions.active=t,$r.call(this,this.media,this.captions.active?"captionsenabled":"captionsdisabled"))}}},{key:"airplay",value:function(){Ea.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=ha(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=fa(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!zr.empty(this.config.settings)&&Ba.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";$r.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){Yr.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){Jr(this.elements.container,e,t)}},{key:"off",value:function(e,t){Qr(this.elements.container,e,t)}},{key:"destroy",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.ready){var i=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(oa(t.elements.buttons.play),oa(t.elements.captions),oa(t.elements.controls),oa(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),zr.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.elements,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),la(t.elements.original,t.elements.container),$r.call(t,t.elements.original,"destroyed",!0),zr.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};switch(this.stop(),this.provider+":"+this.type){case"html5:video":case"html5:audio":clearTimeout(this.timers.loading),eo.toggleNativeControls.call(this,!0),i();break;case"youtube:video":clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&zr.function(this.embed.destroy)&&this.embed.destroy(),i();break;case"vimeo:video":null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200)}}}},{key:"supports",value:function(e){return Ea.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Ga.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Ga.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Ga.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Ka.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Ka.audio)}},{key:"playing",get:function(){return Boolean(this.ready&&!this.paused&&!this.ended)}},{key:"paused",get:function(){return Boolean(this.media.paused)}},{key:"stopped",get:function(){return Boolean(this.paused&&0===this.currentTime)}},{key:"ended",get:function(){return Boolean(this.media.ended)}},{key:"currentTime",set:function(e){if(this.duration){var t=zr.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to "+this.currentTime+" seconds")}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return zr.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}},{key:"seeking",get:function(){return Boolean(this.media.seeking)}},{key:"duration",get:function(){var e=parseFloat(this.config.duration),t=(this.media||{}).duration||0;return e||t}},{key:"volume",set:function(e){var t=e;zr.string(t)&&(t=Number(t)),zr.number(t)||(t=this.storage.get("volume")),zr.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!zr.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;zr.boolean(t)||(t=this.storage.get("muted")),zr.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t},get:function(){return Boolean(this.media.muted)}},{key:"hasAudio",get:function(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}},{key:"speed",set:function(e){var t=null;zr.number(e)&&(t=e),zr.number(t)||(t=this.storage.get("speed")),zr.number(t)||(t=this.config.speed.selected),t<.1&&(t=.1),t>2&&(t=2),this.config.speed.options.includes(t)?(this.config.speed.selected=t,this.media.playbackRate=t):this.debug.warn("Unsupported speed ("+t+")")},get:function(){return Number(this.media.playbackRate)}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!zr.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(zr.number);if(!n.includes(i)){var r=function(e,t){return zr.array(e)&&e.length?e.reduce(function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e}):null}(n,i);this.debug.warn("Unsupported quality option: "+i+", using "+r+" instead"),i=r}$r.call(this,this.media,"qualityrequested",!1,{quality:i}),t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=zr.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t},get:function(){return Boolean(this.media.loop)}},{key:"source",set:function(e){ho.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?eo.setPoster.call(this,e):this.debug.warn("Poster can only be set for video")},get:function(){return this.isVideo?this.media.getAttribute("poster"):null}},{key:"autoplay",set:function(e){var t=zr.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){Wa.set.call(this,e)},get:function(){var e=this.captions,t=e.active,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){Wa.setLanguage.call(this,e)},get:function(){return(Wa.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Ea.pip){var i=zr.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Ea.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Ea.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Ia(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return zr.string(t)?i=Array.from(document.querySelectorAll(t)):zr.nodeList(t)?i=Array.from(t):zr.array(t)&&(i=t.filter(zr.element)),zr.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return po.defaults=(lo=za,JSON.parse(JSON.stringify(lo))),po}); //# sourceMappingURL=plyr.polyfilled.min.js.map diff --git a/dist/plyr.polyfilled.min.js.map b/dist/plyr.polyfilled.min.js.map index 2dc0489a..64d39400 100644 --- a/dist/plyr.polyfilled.min.js.map +++ b/dist/plyr.polyfilled.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","utils/arrays.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","storage.js","utils/time.js","controls.js","utils/loadSprite.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["global","module","exports","window","Math","self","Function","__g","core","version","__e","_isObject","it","_anObject","isObject","TypeError","_fails","exec","e","_descriptors","require$$0","Object","defineProperty","get","a","document","is","createElement","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","fn","val","toString","call","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","key","f","createDesc","hasOwnProperty","_has","id","px","random","_uid","concat","undefined","SRC","$toString","TPL","split","inspectSource","safe","isFunction","has","hide","join","String","prototype","this","_aFunction","_ctx","that","length","aFunction","b","c","apply","arguments","$export","type","name","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","Typed","_export","TYPED","uid","VIEW","ABV","ArrayBuffer","DataView","CONSTR","i","TypedArrayConstructors","_typed","_redefineAll","src","_anInstance","Constructor","forbiddenField","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_toIndex","number","toLength","RangeError","_cof","slice","_iobject","propertyIsEnumerable","cof","_defined","_toIobject","IObject","defined","max","_toAbsoluteIndex","index","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","store","_shared","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","result","push","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_toObject","_arrayFill","toObject","aLen","end","endPos","Symbol","USE_SYMBOL","def","TAG","_setToStringTag","tag","stat","gOPN","PROTOTYPE","WRONG_INDEX","$ArrayBuffer","$DataView","Infinity","BaseBuffer","abs","pow","log","LN2","$BUFFER","DESCRIPTORS","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","m","buffer","Array","eLen","eMax","eBias","rt","s","unpackIEEE754","nBits","NaN","unpackI32","bytes","packI8","packI16","packI32","packF64","packF32","addGetter","C","internal","view","isLittleEndian","intIndex","toIndex","_b","start","pack","reverse","set","conversion","$typed","fails","ArrayBufferProto","anInstance","keys","j","constructor","$setInt8","setInt8","getInt8","redefineAll","byteOffset","setUint8","byteLength","arrayFill","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","setToStringTag","SPECIES","_speciesConstructor","D","_setSpecies","KEY","$isView","isView","$slice","len","first","final","speciesConstructor","viewS","viewT","ARG","_classof","T","tryGet","callee","_iterators","ITERATOR","ArrayProto","_isArrayIter","Iterators","_objectKeys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","contentWindow","open","write","lt","close","_objectCreate","create","dPs","ObjectProto","_objectGpo","getPrototypeOf","core_getIteratorMethod","getIteratorMethod","classof","_isArray","isArray","arg","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","res","UNSCOPABLES","_addToUnscopables","_iterStep","done","IteratorPrototype","_iterCreate","NAME","next","descriptor","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","_arrayCopyWithin","copyWithin","to","from","count","inc","gOPD","getOwnPropertyDescriptor","pIE","require$$3","require$$4","require$$5","$buffer","require$$6","require$$7","require$$8","propertyDesc","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","isArrayIter","require$$21","require$$22","require$$23","require$$24","getIterFn","require$$25","require$$26","wks","require$$27","createArrayMethod","require$$28","createArrayIncludes","require$$29","require$$30","ArrayIterators","require$$31","require$$32","$iterDetect","require$$33","setSpecies","require$$34","require$$35","arrayCopyWithin","require$$36","$DP","require$$37","$GOPD","require$$38","Uint8Array","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayFind","arrayFindIndex","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","lastIndexOf","arrayReduce","reduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","sort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","TYPED_ARRAY","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","validate","speciesFromList","list","fromList","_d","$from","iterator","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","every","fill","filter","find","predicate","findIndex","forEach","indexOf","searchElement","includes","separator","map","middle","some","comparefn","subarray","begin","$begin","BYTES_PER_ELEMENT","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","wrapper","CLAMPED","GETTER","SETTER","TypedArray","TAC","TypedArrayPrototype","addElement","data","v","o","getter","round","setter","$offset","$length","klass","$len","l","$nativeIterator","CORRECT_ITER_NAME","$iterator","of","init","_iterCall","ret","BREAK","RETURN","iterable","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_validateCollection","SIZE","getEntry","entry","_f","n","k","_collectionStrong","getConstructor","ADDER","_l","forOf","clear","r","p","delete","prev","setStrong","$iterDefine","check","_setProto","setPrototypeOf","test","buggy","__proto__","_collection","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","inheritIfRequired","strong","add","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","getSymbols","gOPS","isEnum","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","freeze","method","rApply","Reflect","fApply","thisArgument","argumentsList","L","_invoke","args","un","factories","_bind","bind","partArgs","bound","construct","invoke","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","attributes","deleteProperty","receiver","getProto","$isExtensible","_ownKeys","ownKeys","$preventExtensions","V","existingDescriptor","ownDesc","setProto","defer","channel","port","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","event","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","task","microtask","head","last","notify","flush","parent","domain","exit","enter","navigator","standalone","then","toggle","node","createTextNode","observe","characterData","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","error","_a","onrejectionhandled","$reject","_w","$resolve","executor","err","onFulfilled","onRejected","catch","capability","x","promiseCapability","promiseResolve","all","remaining","$index","alreadyCalled","race","_wksDefine","$Symbol","charAt","wksExt","windowNames","getWindowNames","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","symbols","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","_objectSap","$freeze","$seal","$isFrozen","$isSealed","$getPrototypeOf","_sameValue","y","FProto","nameRE","match","raw","callSite","tpl","fromCharCode","$fromCodePoint","fromCodePoint","code","TO_STRING","$at","pos","charCodeAt","codePointAt","_stringRepeat","str","repeat","MATCH","_isRegexp","isRegExp","_stringContext","searchString","_failsIsRegexp","re","$startsWith","startsWith","context","search","$endsWith","endsWith","endPosition","flags","RegExp","ignoreCase","multiline","unicode","sticky","_fixReWks","SYMBOL","fns","strfn","rxfn","string","$match","regexp","REPLACE","$replace","searchValue","replaceValue","SPLIT","$split","_split","$push","NPCG","limit","separator2","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","replace","SEARCH","$search","_createProperty","createProperty","$find","forced","_isFinite","isFinite","_isInteger","isInteger","isSafeInteger","EPSILON","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","_mathLog1p","log1p","sqrt","$acosh","acosh","Number","MAX_VALUE","$asinh","asinh","$atanh","atanh","_mathSign","sign","cbrt","clz32","LOG2E","cosh","$expm1","expm1","_mathExpm1","EPSILON32","MAX32","MIN32","_mathFround","fround","$abs","$sign","hypot","value1","value2","div","sum","larg","$imul","imul","xn","yn","xl","yl","log10","LOG10E","log2","sinh","tanh","trunc","$includes","_objectToArray","isEntries","$values","getOwnPropertyDescriptors","getDesc","_stringPad","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","_userAgent","userAgent","padStart","$pad","padEnd","MSIE","time","boundArgs","setInterval","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","pop","Context","reset","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","stop","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","Error","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","resultName","nextLoc","protoGenerator","generator","state","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","obj","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","info","pushTryEntry","locs","iteratorMethod","ce","CustomEvent","preventDefault","defaultPrevented","params","evt","origPrevent","bubbles","cancelable","detail","createEvent","initCustomEvent","Event","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","attribute","append","_this","_entries","getAll","callback","thisArg","polyfillURLSearchParams","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","doc","implementation","createHTMLDocument","baseElement","anchorElement","body","protocol","attributeName","_anchorElement","linkURLWithAnchorAttribute","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","hostname","password","username","methodName","createObjectURL","blob","revokeObjectURL","polyfillURL","location","getOrigin","input","instanceOf","Boolean","nullOrUndefined","WeakMap","Element","Text","TextTrackCue","VTTCue","TextTrack","array","nodeList","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","elements","passive","capture","function","element","Node","events","on","off","trigger","dispatchEvent","targets","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref2","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","class","toggleHidden","hidden","boolean","hasAttribute","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","toggleState","pressed","getAttribute","transitionEndEvent","range","browser$1","browser","documentMode","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","matchMedia","dedupe","item","html5","sources","getSources","sizes","player","mime","currentTime","playing","onLoadedMetaData","load","play","config","blankVideo","debug","extend","_len","_key","defineProperty$1","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","seekTime","title","Storage","enabled","storage","localStorage","getItem","json","parse","setItem","removeItem","getHours","parseInt","getMinutes","getSeconds","formatTime","displayHours","inverted","hours","mins","secs","controls","cors","iconUrl","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","duration","seekTooltip","classNames","tooltip","warn","toggleNativeControls","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","updateRangeFill","suffix","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","current","toFixed","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","width","pageX","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","speed","isVimeo","_this5","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","scrollWidth","height","scrollHeight","getElementById","transitions","reducedMotion","size","getTabSize","restore","propertyName","focus","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","hasId","exists","update","insertAdjacentElement","useStorage","cached","prefix","content","props","_ref3","findElements","offsetHeight","labels","_this7","fetch","responseType","request","XMLHttpRequest","responseText","response","statusText","send","parseUrl","parser","buildUrlParams","isYouTube","textTracks","setCaptionsMenu","userLanguage","setLanguage","trackEvents","_captions","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","caption","defaults","providers","types","noop","Console","onChange","isIos","focusable","trap","keyCode","shiftKey","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","which","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","vimeo","setAspectRatio","Vimeo","urls","sdk","ratio","padding","paddingBottom","transform","autoplay","$2","embedContainer","thumbnail_large","Player","autopause","disableTextTrack","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","fragment","createDocumentFragment","firstChild","getPaused","seconds","build","mapQualityUnit","youtube","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","snippet","currentId","posterSrc","format$$1","backgroundSize","message","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","adError","zIndex","_this10","destroy","handlers","_this11","Date","cancelRequests","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","tagName","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","curr","closest","change","states","webkitPresentationMode","inline","t"],"mappings":"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,IACA,0BAMI,mBAOE,WAEN,GACA,IACA,EACA,KACA,IACA,KACA,uBAMK,UACD,uBAKE,QACJ,qBAKE,WACE,eAGF,wBAKC,YACC,aACC,qBAKF,MACJ,kBAKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,cACE,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,iBACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,+BACF,+BACF,+BACE,mCAEF,2BACA,0BACD,+BAEI,mDAMP,qBACI,kBACH,4BACA,mCACS,sCACR,6BACO,2BACV,oBACI,wBACA,uBACD,uBACC,wBACA,sBACF,sBACE,qBACH,oBACE,6BACM,4BACP,uBACE,6BACI,6BACC,kCAEH,0BACA,mBACD,qCAGG,gCACD,6CAGC,oCACC,4CAGC,6BACH,uCAGG,iCACH,iCAEF,+CAMI,wBACN,oCAMA,oBAMC,cACI,KC7YRC,UACF,gBACE,gBACF,SAGEC,UACF,cACA,SCRX,IAAMC,GAAO,aAEQC,GAAAA,4BACLvN,EA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","file":"plyr.polyfilled.min.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\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\ntry {\n var ce = new window.CustomEvent('test');\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 bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\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\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\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 */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\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 */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\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 */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener(element, events, callback, false, passive, capture);\n}\n\n// Trigger event\nexport function trigger(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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default { browser };\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport { removeElement } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (is.empty(sources)) {\n return null;\n }\n\n // Get <source> with size attribute\n const sizes = Array.from(sources).filter(source => !is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n player.off('loadedmetadata', onLoadedMetaData);\n };\n player.on('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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());\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { off, on } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (is.array(options)) {\n this.options.quality = 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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.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(container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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(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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on(track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n trigger.call(this, this.media, 'languagechange');\n }\n\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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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 trigger.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, trigger } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n on(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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 trigger.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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on, toggleListener, trigger } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on(this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n on(this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on(this.player.media, 'loadeddata canplay', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n trigger.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n trigger.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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n trigger.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n trigger.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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 trigger.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n trigger.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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n trigger.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n trigger.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n trigger.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n trigger.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n trigger.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 trigger.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n trigger.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', detail => {\n player.media.error = detail;\n trigger.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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 trigger.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n trigger.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n trigger.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n trigger.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n trigger.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n const quality = input;\n\n // Set via API\n instance.setPlaybackQuality(mapQualityUnit(quality));\n\n // Trigger request event\n trigger.call(player, player.media, 'qualityrequested', false, {\n quality,\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n trigger.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n trigger.call(player, player.media, 'timeupdate');\n trigger.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n trigger.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n trigger.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n trigger.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n trigger.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n trigger.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n trigger.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n trigger.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n trigger.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n trigger.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n trigger.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { trigger } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n trigger.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, trigger } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadScript';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (!url.searchParams) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on(this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n let quality = null;\n\n if (!is.empty(input)) {\n quality = Number(input);\n }\n\n if (!is.number(quality)) {\n quality = this.storage.get('quality');\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.selected;\n }\n\n if (!is.number(quality)) {\n quality = this.config.quality.default;\n }\n\n if (!this.options.quality.length) {\n return;\n }\n\n if (!this.options.quality.includes(quality)) {\n const value = closest(this.options.quality, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Update config\n this.config.quality.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n trigger.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on(this.elements.container, event, callback);\n }\n\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n this.listeners.clear();\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n trigger.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file +{"version":3,"sources":["../../node_modules/core-js/modules/_global.js","../../node_modules/core-js/modules/_core.js","../../node_modules/core-js/modules/_is-object.js","../../node_modules/core-js/modules/_an-object.js","../../node_modules/core-js/modules/_fails.js","../../node_modules/core-js/modules/_descriptors.js","../../node_modules/core-js/modules/_dom-create.js","../../node_modules/core-js/modules/_ie8-dom-define.js","../../node_modules/core-js/modules/_to-primitive.js","../../node_modules/core-js/modules/_object-dp.js","../../node_modules/core-js/modules/_property-desc.js","../../node_modules/core-js/modules/_hide.js","../../node_modules/core-js/modules/_has.js","../../node_modules/core-js/modules/_uid.js","../../node_modules/core-js/modules/_redefine.js","../../node_modules/core-js/modules/_a-function.js","../../node_modules/core-js/modules/_ctx.js","../../node_modules/core-js/modules/_export.js","../../node_modules/core-js/modules/_typed.js","../../node_modules/core-js/modules/_redefine-all.js","../../node_modules/core-js/modules/_an-instance.js","../../node_modules/core-js/modules/_to-integer.js","../../node_modules/core-js/modules/_to-length.js","../../node_modules/core-js/modules/_to-index.js","../../node_modules/core-js/modules/_cof.js","../../node_modules/core-js/modules/_iobject.js","../../node_modules/core-js/modules/_defined.js","../../node_modules/core-js/modules/_to-iobject.js","../../node_modules/core-js/modules/_to-absolute-index.js","../../node_modules/core-js/modules/_array-includes.js","../../node_modules/core-js/modules/_shared.js","../../node_modules/core-js/modules/_shared-key.js","../../node_modules/core-js/modules/_object-keys-internal.js","../../node_modules/core-js/modules/_enum-bug-keys.js","../../node_modules/core-js/modules/_object-gopn.js","../../node_modules/core-js/modules/_to-object.js","../../node_modules/core-js/modules/_array-fill.js","../../node_modules/core-js/modules/_wks.js","../../node_modules/core-js/modules/_set-to-string-tag.js","../../node_modules/core-js/modules/_typed-buffer.js","../../node_modules/core-js/modules/_species-constructor.js","../../node_modules/core-js/modules/_set-species.js","../../node_modules/core-js/modules/es6.typed.array-buffer.js","../../node_modules/core-js/modules/_classof.js","../../node_modules/core-js/modules/_iterators.js","../../node_modules/core-js/modules/_is-array-iter.js","../../node_modules/core-js/modules/_object-keys.js","../../node_modules/core-js/modules/_object-dps.js","../../node_modules/core-js/modules/_html.js","../../node_modules/core-js/modules/_object-create.js","../../node_modules/core-js/modules/_object-gpo.js","../../node_modules/core-js/modules/core.get-iterator-method.js","../../node_modules/core-js/modules/_is-array.js","../../node_modules/core-js/modules/_array-species-constructor.js","../../node_modules/core-js/modules/_array-species-create.js","../../node_modules/core-js/modules/_array-methods.js","../../node_modules/core-js/modules/_add-to-unscopables.js","../../node_modules/core-js/modules/_iter-step.js","../../node_modules/core-js/modules/_iter-create.js","../../node_modules/core-js/modules/_iter-define.js","../../node_modules/core-js/modules/es6.array.iterator.js","../../node_modules/core-js/modules/_iter-detect.js","../../node_modules/core-js/modules/_array-copy-within.js","../../node_modules/core-js/modules/_object-pie.js","../../node_modules/core-js/modules/_object-gopd.js","../../node_modules/core-js/modules/_typed-array.js","../../node_modules/core-js/modules/es6.typed.int8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-array.js","../../node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../node_modules/core-js/modules/es6.typed.int16-array.js","../../node_modules/core-js/modules/es6.typed.uint16-array.js","../../node_modules/core-js/modules/es6.typed.int32-array.js","../../node_modules/core-js/modules/es6.typed.uint32-array.js","../../node_modules/core-js/modules/es6.typed.float32-array.js","../../node_modules/core-js/modules/es6.typed.float64-array.js","../../node_modules/core-js/modules/_iter-call.js","../../node_modules/core-js/modules/_for-of.js","../../node_modules/core-js/modules/_meta.js","../../node_modules/core-js/modules/_validate-collection.js","../../node_modules/core-js/modules/_collection-strong.js","../../node_modules/core-js/modules/_set-proto.js","../../node_modules/core-js/modules/_inherit-if-required.js","../../node_modules/core-js/modules/_collection.js","../../node_modules/core-js/modules/es6.map.js","../../node_modules/core-js/modules/es6.set.js","../../node_modules/core-js/modules/_object-gops.js","../../node_modules/core-js/modules/_object-assign.js","../../node_modules/core-js/modules/_collection-weak.js","../../node_modules/core-js/modules/es6.weak-map.js","../../node_modules/core-js/modules/es6.weak-set.js","../../node_modules/core-js/modules/es6.reflect.apply.js","../../node_modules/core-js/modules/_invoke.js","../../node_modules/core-js/modules/_bind.js","../../node_modules/core-js/modules/es6.reflect.construct.js","../../node_modules/core-js/modules/es6.reflect.define-property.js","../../node_modules/core-js/modules/es6.reflect.delete-property.js","../../node_modules/core-js/modules/es6.reflect.get.js","../../node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../node_modules/core-js/modules/es6.reflect.has.js","../../node_modules/core-js/modules/es6.reflect.is-extensible.js","../../node_modules/core-js/modules/_own-keys.js","../../node_modules/core-js/modules/es6.reflect.own-keys.js","../../node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../node_modules/core-js/modules/es6.reflect.set.js","../../node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../node_modules/core-js/modules/_task.js","../../node_modules/core-js/modules/_microtask.js","../../node_modules/core-js/modules/_new-promise-capability.js","../../node_modules/core-js/modules/es6.promise.js","../../node_modules/core-js/modules/_perform.js","../../node_modules/core-js/modules/_promise-resolve.js","../../node_modules/core-js/modules/_wks-ext.js","../../node_modules/core-js/modules/_wks-define.js","../../node_modules/core-js/modules/_object-gopn-ext.js","../../node_modules/core-js/modules/es6.symbol.js","../../node_modules/core-js/modules/_enum-keys.js","../../node_modules/core-js/modules/_object-sap.js","../../node_modules/core-js/modules/es6.object.freeze.js","../../node_modules/core-js/modules/es6.object.seal.js","../../node_modules/core-js/modules/es6.object.prevent-extensions.js","../../node_modules/core-js/modules/es6.object.is-frozen.js","../../node_modules/core-js/modules/es6.object.is-sealed.js","../../node_modules/core-js/modules/es6.object.is-extensible.js","../../node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../node_modules/core-js/modules/es6.object.get-prototype-of.js","../../node_modules/core-js/modules/es6.object.keys.js","../../node_modules/core-js/modules/es6.object.get-own-property-names.js","../../node_modules/core-js/modules/es6.object.assign.js","../../node_modules/core-js/modules/_same-value.js","../../node_modules/core-js/modules/es6.object.is.js","../../node_modules/core-js/modules/es6.function.name.js","../../node_modules/core-js/modules/es6.string.raw.js","../../node_modules/core-js/modules/es6.string.from-code-point.js","../../node_modules/core-js/modules/_string-at.js","../../node_modules/core-js/modules/es6.string.code-point-at.js","../../node_modules/core-js/modules/_string-repeat.js","../../node_modules/core-js/modules/es6.string.repeat.js","../../node_modules/core-js/modules/_is-regexp.js","../../node_modules/core-js/modules/_string-context.js","../../node_modules/core-js/modules/_fails-is-regexp.js","../../node_modules/core-js/modules/es6.string.starts-with.js","../../node_modules/core-js/modules/es6.string.ends-with.js","../../node_modules/core-js/modules/es6.string.includes.js","../../node_modules/core-js/modules/es6.regexp.flags.js","../../node_modules/core-js/modules/_flags.js","../../node_modules/core-js/modules/_fix-re-wks.js","../../node_modules/core-js/modules/es6.regexp.match.js","../../node_modules/core-js/modules/es6.regexp.replace.js","../../node_modules/core-js/modules/es6.regexp.split.js","../../node_modules/core-js/modules/es6.regexp.search.js","../../node_modules/core-js/modules/_create-property.js","../../node_modules/core-js/modules/es6.array.from.js","../../node_modules/core-js/modules/es6.array.of.js","../../node_modules/core-js/modules/es6.array.copy-within.js","../../node_modules/core-js/modules/es6.array.find.js","../../node_modules/core-js/modules/es6.array.find-index.js","../../node_modules/core-js/modules/es6.array.fill.js","../../node_modules/core-js/modules/es6.number.is-finite.js","../../node_modules/core-js/modules/_is-integer.js","../../node_modules/core-js/modules/es6.number.is-integer.js","../../node_modules/core-js/modules/es6.number.is-safe-integer.js","../../node_modules/core-js/modules/es6.number.is-nan.js","../../node_modules/core-js/modules/es6.number.epsilon.js","../../node_modules/core-js/modules/es6.number.min-safe-integer.js","../../node_modules/core-js/modules/es6.number.max-safe-integer.js","../../node_modules/core-js/modules/_math-log1p.js","../../node_modules/core-js/modules/es6.math.acosh.js","../../node_modules/core-js/modules/es6.math.asinh.js","../../node_modules/core-js/modules/es6.math.atanh.js","../../node_modules/core-js/modules/_math-sign.js","../../node_modules/core-js/modules/es6.math.cbrt.js","../../node_modules/core-js/modules/es6.math.clz32.js","../../node_modules/core-js/modules/es6.math.cosh.js","../../node_modules/core-js/modules/_math-expm1.js","../../node_modules/core-js/modules/es6.math.expm1.js","../../node_modules/core-js/modules/_math-fround.js","../../node_modules/core-js/modules/es6.math.fround.js","../../node_modules/core-js/modules/es6.math.hypot.js","../../node_modules/core-js/modules/es6.math.imul.js","../../node_modules/core-js/modules/es6.math.log1p.js","../../node_modules/core-js/modules/es6.math.log10.js","../../node_modules/core-js/modules/es6.math.log2.js","../../node_modules/core-js/modules/es6.math.sign.js","../../node_modules/core-js/modules/es6.math.sinh.js","../../node_modules/core-js/modules/es6.math.tanh.js","../../node_modules/core-js/modules/es6.math.trunc.js","../../node_modules/core-js/modules/es7.array.includes.js","../../node_modules/core-js/modules/_object-to-array.js","../../node_modules/core-js/modules/es7.object.values.js","../../node_modules/core-js/modules/es7.object.entries.js","../../node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../node_modules/core-js/modules/_string-pad.js","../../node_modules/core-js/modules/_user-agent.js","../../node_modules/core-js/modules/es7.string.pad-start.js","../../node_modules/core-js/modules/es7.string.pad-end.js","../../node_modules/core-js/modules/web.timers.js","../../node_modules/core-js/modules/web.immediate.js","../../node_modules/core-js/modules/web.dom.iterable.js","../../node_modules/regenerator-runtime/runtime.js","../../node_modules/custom-event-polyfill/custom-event-polyfill.js","../../node_modules/url-polyfill/url-polyfill.js","utils/is.js","utils/events.js","utils/elements.js","utils/animation.js","utils/browser.js","support.js","html5.js","utils/objects.js","utils/strings.js","i18n.js","utils/arrays.js","storage.js","utils/loadSprite.js","utils/time.js","controls.js","utils/fetch.js","utils/urls.js","captions.js","config/defaults.js","config/types.js","console.js","fullscreen.js","utils/loadImage.js","ui.js","listeners.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils/loadScript.js","plugins/vimeo.js","plugins/youtube.js","media.js","plugins/ads.js","source.js","plyr.js"],"names":["global","module","exports","window","Math","self","Function","__g","core","version","__e","_isObject","it","_anObject","isObject","TypeError","_fails","exec","e","_descriptors","require$$0","Object","defineProperty","get","a","document","is","createElement","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","fn","val","toString","call","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","value","_propertyDesc","bitmap","enumerable","configurable","writable","_hide","object","key","f","createDesc","hasOwnProperty","_has","id","px","random","_uid","concat","undefined","SRC","$toString","TPL","split","inspectSource","safe","isFunction","has","hide","join","String","prototype","this","_aFunction","_ctx","that","length","aFunction","b","c","apply","arguments","$export","type","name","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","Typed","_export","TYPED","uid","VIEW","ABV","ArrayBuffer","DataView","CONSTR","i","TypedArrayConstructors","_typed","_redefineAll","src","_anInstance","Constructor","forbiddenField","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_toIndex","number","toLength","RangeError","_cof","slice","_iobject","propertyIsEnumerable","cof","_defined","_toIobject","IObject","defined","max","_toAbsoluteIndex","index","_arrayIncludes","IS_INCLUDES","$this","el","fromIndex","toIObject","toAbsoluteIndex","store","_shared","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","result","push","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_toObject","_arrayFill","toObject","aLen","end","endPos","Symbol","USE_SYMBOL","def","TAG","_setToStringTag","tag","stat","gOPN","PROTOTYPE","WRONG_INDEX","$ArrayBuffer","$DataView","Infinity","BaseBuffer","abs","pow","log","LN2","$BUFFER","DESCRIPTORS","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","m","buffer","Array","eLen","eMax","eBias","rt","s","unpackIEEE754","nBits","NaN","unpackI32","bytes","packI8","packI16","packI32","packF64","packF32","addGetter","C","internal","view","isLittleEndian","intIndex","toIndex","_b","start","pack","reverse","set","conversion","$typed","fails","ArrayBufferProto","anInstance","keys","j","constructor","$setInt8","setInt8","getInt8","redefineAll","byteOffset","setUint8","byteLength","arrayFill","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","setToStringTag","SPECIES","_speciesConstructor","D","_setSpecies","KEY","$isView","isView","$slice","len","first","final","speciesConstructor","viewS","viewT","ARG","_classof","T","tryGet","callee","_iterators","ITERATOR","ArrayProto","_isArrayIter","Iterators","_objectKeys","enumBugKeys","_objectDps","defineProperties","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","appendChild","contentWindow","open","write","lt","close","_objectCreate","create","dPs","ObjectProto","_objectGpo","getPrototypeOf","core_getIteratorMethod","getIteratorMethod","classof","_isArray","isArray","arg","_arraySpeciesCreate","original","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","asc","callbackfn","res","UNSCOPABLES","_addToUnscopables","_iterStep","done","IteratorPrototype","_iterCreate","NAME","next","descriptor","BUGGY","returnThis","_iterDefine","Base","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","es6_array_iterator","iterated","_t","_i","_k","step","Arguments","addToUnscopables","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","_arrayCopyWithin","copyWithin","to","from","count","inc","gOPD","getOwnPropertyDescriptor","pIE","require$$3","require$$4","require$$5","$buffer","require$$6","require$$7","require$$8","propertyDesc","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","isArrayIter","require$$21","require$$22","require$$23","require$$24","getIterFn","require$$25","require$$26","wks","require$$27","createArrayMethod","require$$28","createArrayIncludes","require$$29","require$$30","ArrayIterators","require$$31","require$$32","$iterDetect","require$$33","setSpecies","require$$34","require$$35","arrayCopyWithin","require$$36","$DP","require$$37","$GOPD","require$$38","Uint8Array","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayFind","arrayFindIndex","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","lastIndexOf","arrayReduce","reduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","sort","arraySlice","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","TYPED_ARRAY","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","validate","speciesFromList","list","fromList","_d","$from","iterator","mapfn","mapping","iterFn","$of","TO_LOCALE_BUG","$toLocaleString","every","fill","filter","find","predicate","findIndex","forEach","indexOf","searchElement","includes","separator","map","middle","some","comparefn","subarray","begin","$begin","BYTES_PER_ELEMENT","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","desc","$TypedArrayPrototype$","wrapper","CLAMPED","GETTER","SETTER","TypedArray","TAC","TypedArrayPrototype","addElement","data","v","o","getter","round","setter","$offset","$length","klass","$len","l","$nativeIterator","CORRECT_ITER_NAME","$iterator","of","init","_iterCall","ret","BREAK","RETURN","iterable","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","_validateCollection","SIZE","getEntry","entry","_f","n","k","_collectionStrong","getConstructor","ADDER","_l","forOf","clear","r","p","delete","prev","setStrong","$iterDefine","check","_setProto","setPrototypeOf","test","buggy","__proto__","_collection","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","inheritIfRequired","strong","add","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","getSymbols","gOPS","isEnum","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","splice","_collectionWeak","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","freeze","method","rApply","Reflect","fApply","thisArgument","argumentsList","L","_invoke","args","un","factories","_bind","bind","partArgs","bound","construct","invoke","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","attributes","deleteProperty","receiver","getProto","$isExtensible","_ownKeys","ownKeys","$preventExtensions","V","existingDescriptor","ownDesc","setProto","defer","channel","port","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","event","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","cel","html","removeChild","setTimeout","_task","macrotask","Observer","MutationObserver","WebKitMutationObserver","Promise","isNode","PromiseCapability","resolve","reject","promise","$$resolve","$$reject","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","_perform","task","microtask","head","last","notify","flush","parent","domain","exit","enter","navigator","standalone","then","toggle","node","createTextNode","observe","characterData","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","error","_a","onrejectionhandled","$reject","_w","$resolve","executor","err","onFulfilled","onRejected","catch","capability","x","promiseCapability","promiseResolve","all","remaining","$index","alreadyCalled","race","_wksDefine","$Symbol","charAt","wksExt","windowNames","getWindowNames","gOPNExt","$JSON","JSON","_stringify","stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","$fails","_create","protoDesc","wrap","sym","isSymbol","$defineProperty","$defineProperties","symbols","enumKeys","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","wksDefine","for","keyFor","useSetter","useSimple","replacer","$replacer","_objectSap","$freeze","$seal","$isFrozen","$isSealed","$getPrototypeOf","_sameValue","y","FProto","nameRE","match","raw","callSite","tpl","fromCharCode","$fromCodePoint","fromCodePoint","code","TO_STRING","$at","pos","charCodeAt","codePointAt","_stringRepeat","str","repeat","MATCH","_isRegexp","isRegExp","_stringContext","searchString","_failsIsRegexp","re","$startsWith","startsWith","context","search","$endsWith","endsWith","endPosition","flags","RegExp","ignoreCase","multiline","unicode","sticky","_fixReWks","SYMBOL","fns","strfn","rxfn","string","$match","regexp","REPLACE","$replace","searchValue","replaceValue","SPLIT","$split","_split","$push","NPCG","limit","separator2","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","replace","SEARCH","$search","_createProperty","createProperty","$find","forced","_isFinite","isFinite","_isInteger","isInteger","isSafeInteger","EPSILON","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","_mathLog1p","log1p","sqrt","$acosh","acosh","Number","MAX_VALUE","$asinh","asinh","$atanh","atanh","_mathSign","sign","cbrt","clz32","LOG2E","cosh","$expm1","expm1","_mathExpm1","EPSILON32","MAX32","MIN32","_mathFround","fround","$abs","$sign","hypot","value1","value2","div","sum","larg","$imul","imul","xn","yn","xl","yl","log10","LOG10E","log2","sinh","tanh","trunc","$includes","_objectToArray","isEntries","$values","getOwnPropertyDescriptors","getDesc","_stringPad","maxLength","fillString","left","stringLength","fillStr","intMaxLength","fillLen","stringFiller","_userAgent","userAgent","padStart","$pad","padEnd","MSIE","time","boundArgs","setInterval","$task","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","runtime","regeneratorRuntime","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","__await","defineIteratorMethods","AsyncIterator","async","innerFn","outerFn","tryLocsList","pop","Context","reset","skipTempReset","sent","_sent","delegate","tryEntries","resetTryEntry","stop","rootRecord","completion","rval","dispatchException","exception","handle","loc","caught","record","tryLoc","hasCatch","hasFinally","catchLoc","finallyLoc","Error","abrupt","finallyEntry","complete","afterLoc","finish","thrown","delegateYield","resultName","nextLoc","protoGenerator","generator","state","doneResult","delegateResult","maybeInvokeDelegate","tryCatch","makeInvokeMethod","obj","unwrapped","previousPromise","callInvokeWithMethodAndArg","return","info","pushTryEntry","locs","iteratorMethod","ce","CustomEvent","preventDefault","defaultPrevented","params","evt","origPrevent","bubbles","cancelable","detail","createEvent","initCustomEvent","Event","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","shift","serializeParam","encodeURIComponent","deserializeParam","decodeURIComponent","URLSearchParams","attribute","append","_this","_entries","getAll","callback","thisArg","polyfillURLSearchParams","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","doc","implementation","createHTMLDocument","baseElement","anchorElement","body","protocol","attributeName","_anchorElement","linkURLWithAnchorAttribute","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","hostname","password","username","methodName","createObjectURL","blob","revokeObjectURL","polyfillURL","location","getOrigin","input","instanceOf","Boolean","nullOrUndefined","WeakMap","Element","Text","TextTrackCue","VTTCue","TextTrack","array","nodeList","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","elements","passive","capture","once","function","element","Node","events","eventListeners","on","off","onceCallback","_len","_key","triggerEvent","dispatchEvent","targets","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref2","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","class","toggleHidden","hidden","boolean","hasAttribute","removeAttribute","toggleClass","force","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","getFocusElement","focused","activeElement","toggleState","pressed","getAttribute","transitionEndEvent","range","browser","documentMode","platform","support","provider","playsinline","api","ui","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","matchMedia","html5","mime","getSources","player","currentTime","playing","load","play","config","blankVideo","debug","extend","sources","defineProperty$1","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","seekTime","title","dedupe","item","Storage","enabled","storage","localStorage","getItem","json","parse","setItem","removeItem","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","prefix","content","getHours","parseInt","getMinutes","getSeconds","formatTime","displayHours","inverted","hours","mins","secs","controls","cors","iconUrl","host","isIE","svg4everybody","selectors","buttons","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","duration","seekTooltip","classNames","tooltip","warn","toggleNativeControls","getIconUrl","iconPath","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","badge","menu","buttonType","button","label","labelPressed","iconPressed","control","createIcon","createLabel","updateRangeFill","suffix","_ref$badge","checked","_ref$checked","radio","faux","insertAdjacentHTML","forceHours","setRange","muted","current","toFixed","getElementsByTagName","nodeValue","buffered","isWebkit","setProperty","tooltips","percent","clientRect","getBoundingClientRect","visible","_toggle","_this2","touch","width","pageX","parseFloat","updateTimeDisplay","invert","invertTime","seeking","updateProgress","hasDuration","displayDuration","paused","updateSeekTooltip","setting","tabs","panes","quality","_this3","toggleTab","checkMenu","sorting","createMenuItem","getLabel","createBadge","getBadge","updateSetting","pane","currentTrack","default","tracks","getTracks","track","_this4","active","language","unshift","speed","isVimeo","_this5","tab","form","show","isMenuItem","isButton","stopPropagation","clone","position","opacity","scrollWidth","height","scrollHeight","transitions","reducedMotion","size","getTabSize","propertyName","focus","createButton","createRange","createProgress","createTime","inner","home","_this6","back","setQualityMenu","getQualityOptions","setSpeedMenu","props","_ref3","findElements","offsetHeight","labels","_this7","fetch","responseType","request","XMLHttpRequest","responseText","response","statusText","send","parseUrl","parser","buildUrlParams","isYouTube","textTracks","setCaptionsMenu","userLanguage","setLanguage","trackEvents","_captions","mode","updateCues","trackRemoved","currentTrackNode","firstMatch","getCurrentTrack","embed","enableTextTrack","toggleCaptions","fromLanguage","sortIsDefault","sorted","cues","activeCues","cue","getCueAsHTML","cueText","caption","defaults","providers","types","noop","Console","onChange","isIos","focusable","trap","keyCode","shiftKey","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","overflow","fallback","Fullscreen","property","native","iosNative","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exitFullscreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","uiSupported","listeners","inject","setup","loop","updateVolume","timeUpdate","checkPlaying","isTouch","ready","setTitle","poster","backgroundImage","setPoster","durationUpdate","isEmbed","enable","posterEnabled","loadPromise","togglePoster","stopped","toggleControls","loading","timers","hideControls","hover","Listeners","lastKey","handleKey","toggleMenu","firstTouch","which","altKey","ctrlKey","metaKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","keyboard","tabFocus","delay","hasAudio","resetOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","_event$detail","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","showHomeTab","showTab","currentTarget","eventType","seekTo","toggleInvert","_player","noTransition","webkitDirectionInvertedFromDevice","direction","deltaY","deltaX","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","vimeo","setAspectRatio","Vimeo","urls","sdk","ratio","padding","paddingBottom","transform","autoplay","$2","embedContainer","thumbnail_large","Player","autopause","disableTextTrack","restorePause","setVolume","setCurrentTime","selected","setPlaybackRate","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","_ref$cues","fragment","createDocumentFragment","firstChild","getPaused","seconds","build","mapQualityUnit","youtube","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","google","snippet","currentId","posterSrc","format$$1","backgroundSize","message","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stopVideo","getPlaybackQuality","setPlaybackQuality","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","levels","getAvailableQualityLevels","level","unMute","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","_this8","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","_this9","adError","zIndex","_this10","destroy","handlers","_this11","Date","cancelRequests","crossorigin","addStyleHook","insertElements","Plyr","failed","jQuery","plyr","tagName","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","curr","closest","change","states","webkitPresentationMode","inline","t"],"mappings":"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K,YAC9ExN,UAAYwB,OACf9I,SAASyK,SAASngC,YAAYwqC,MAGtBh7C,KAAKwC,KAAMA,KAAKmpC,MAAO,wBA1B/BgB,MAAM0E,KAAK,4BAA6BpM,aANxC0H,MAAM0E,KAAK,sCCtPtB4J,aAEO,QAGF,UAGA,YAGG,aAGC,WAGD,UAGF,SACD,WAGG,sBAIO,cAGL,gBAGE,QAGP,oBAGM,gBAGC,cAGF,sBAGQ,cAGR,aACA,eACH,iDAGG,wDAIC,aAEL,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,0BAMI,mBAOE,WAEN,GACA,IACA,EACA,KACA,IACA,KACA,uBAMK,UACD,uBAKE,QACJ,qBAKE,WACE,eAGF,wBAKC,YACC,aACC,qBAKF,MACJ,kBAKL,+BAMA,eACA,OACA,SACA,WACA,WACA,MACA,UACA,wBAGA,WACA,UACA,uBAKS,iBACD,0BACF,aACC,oBACM,2BACP,cACE,kBACE,uBACG,wBACH,kBACF,cACF,cACE,wBACQ,kCACC,mCACA,kCACD,6BACJ,8BACF,oBACA,iBACH,eACC,iBACC,eACH,aACC,YACF,UACA,YACE,iBACG,mBACD,wBACM,wBAEL,UACA,UACA,SACD,SACA,SACA,wBAOA,gDACG,6CACH,wDAGA,yCACA,wHAGA,uEAMH,UACA,WACC,aACE,YACD,iBACK,UACP,YACE,cACE,gBACE,SACP,aACI,WACF,aACE,UACH,cACI,sBAQV,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,8BAIA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,sBAIA,gBACA,+BAIA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,gCAMU,uDACC,4BAEI,aACF,0BAEL,4BAEE,2BACC,8BACE,+BACD,mCACK,kCACP,8BACI,oCACE,+BACP,4BACI,iCACC,8BACJ,mCAGA,4BACE,6BACD,+BACG,iCACD,8CAGI,gCACH,+BACF,+BACF,+BACE,mCAEF,2BACA,0BACD,+BAEI,mD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","file":"plyr.polyfilled.min.js","sourcesContent":["// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var final = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(final - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < final) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","module.exports = {};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","exports.f = {}.propertyIsEnumerable;\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","exports.f = Object.getOwnPropertySymbols;\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n require('./_object-gops').f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n","// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n","// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = require('./_is-regexp');\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n","// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\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\ntry {\n var ce = new window.CustomEvent('test');\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 bubbles: false,\n cancelable: false,\n detail: undefined\n };\n\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\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n}\n","(function(global) {\r\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 */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch(error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if(iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\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 */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(value).replace(/\\+/g, ' ');\r\n };\r\n\r\n var polyfillURLSearchParams= function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { value: {} });\r\n\r\n if(typeof searchString === 'string') {\r\n if(searchString !== '') {\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for(var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n } else if(searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(value, name);\r\n });\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if(name in this._entries) {\r\n this._entries[name].push(value.toString());\r\n } else {\r\n this._entries[name] = [value.toString()];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [value.toString()];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for(var name in this._entries) {\r\n if(this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for(var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push(name); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) { items.push(value); });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) { items.push([name, value]); });\r\n return createIterator(items);\r\n };\r\n\r\n if(iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchString = '';\r\n this.forEach(function(value, name) {\r\n if(searchString.length > 0) searchString+= '&';\r\n searchString += serializeParam(name) + '=' + serializeParam(value);\r\n });\r\n return searchString;\r\n };\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n if(!('URLSearchParams' in global) || (new URLSearchParams('?a=1').toString() !== 'a=1')) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\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 */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new URL('b', 'http://a');\r\n u.pathname = 'c%20d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch(e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if(typeof url !== 'string') url = String(url);\r\n\r\n var doc = document.implementation.createHTMLDocument('');\r\n window.doc = doc;\r\n if(base) {\r\n var baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n\r\n if(anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol', 'search']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href' : {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/,'');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname' : {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/,'/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = {'http:': 80, 'https:': 443, 'ftp:': 21}[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== ''\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'searchParams': {\r\n get: function() {\r\n var searchParams = new URLSearchParams(this.search);\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n _this.search = searchParams.toString();\r\n };\r\n });\r\n return searchParams;\r\n },\r\n enumerable: true\r\n }\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if(!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch(e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\n\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst is = {\n object(input) {\n return getConstructor(input) === Object;\n },\n number(input) {\n return getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return getConstructor(input) === String;\n },\n boolean(input) {\n return getConstructor(input) === Boolean;\n },\n function(input) {\n return getConstructor(input) === Function;\n },\n array(input) {\n return !is.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return instanceOf(input, WeakMap);\n },\n nodeList(input) {\n return instanceOf(input, NodeList);\n },\n element(input) {\n return instanceOf(input, Element);\n },\n textNode(input) {\n return getConstructor(input) === Text;\n },\n event(input) {\n return instanceOf(input, Event);\n },\n cue(input) {\n return instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n },\n track(input) {\n return instanceOf(input, TextTrack) || (!is.nullOrUndefined(input) && is.string(input.kind));\n },\n url(input) {\n return !is.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n is.nullOrUndefined(input) ||\n ((is.string(input) || is.array(input) || is.nodeList(input)) && !input.length) ||\n (is.object(input) && !Object.keys(input).length)\n );\n },\n};\n\nexport default is;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\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\nconst 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 (e) {\n // Do nothing\n }\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) {\n // Bail if no elemetns, event, or callback\n if (is.empty(elements) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (is.nodeList(elements) || is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\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 && !once) {\n // Cache event listener\n this.eventListeners.push({ elements, type, callback, options });\n }\n\n elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport 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\nexport 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\nexport function once(element, events = '', callback, passive = true, capture = false) {\n function onceCallback(...args) {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n }\n\n toggleListener(element, events, onceCallback, true, passive, capture, true);\n}\n\n// Trigger event\nexport 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: Object.assign({}, detail, {\n plyr: this,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const { elements, type, callback, options } = item;\n elements.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { off, on } from './events';\nimport is from './is';\n\n// Wrap an element\nexport 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)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\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\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new <element>\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// Inaert an element after another\nexport function insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n // Inject the new <element>\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport 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)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\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\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.object(existing) && is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return null;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Get the focused element\nexport function getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n if (!is.element(element)) {\n return;\n }\n\n const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = getFocusElement();\n\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\n if (toggle) {\n on(this.elements.container, 'keydown', trap, false);\n } else {\n off(this.elements.container, 'keydown', trap, false);\n }\n}\n\n// Toggle aria-pressed state on a toggle button\n// http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\nexport function toggleState(element, input) {\n // If multiple elements passed\n if (is.array(element) || is.nodeList(element)) {\n Array.from(element).forEach(target => toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n setTimeout(() => {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n let api = false;\n let ui = false;\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => !browser.isIPhone && is.function(createElement('video').webkitSetPresentationMode))(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // <input type=\"range\"> Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\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\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\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\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources\n return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n },\n\n // Get quality levels\n getQualityOptions() {\n // Get sizes from <source> elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\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.filter(source => source.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n // Get first match for requested size\n const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Restore time\n const onLoadedMetaData = () => {\n player.currentTime = currentTime;\n };\n player.once('loadedmetadata', onLoadedMetaData);\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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\nexport default html5;\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport 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\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, (match, i) => (is.string(args[i]) ? args[i] : ''));\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return (current / max * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport 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\nexport 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\nexport 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\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\nimport { replaceAll } from './utils/strings';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\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\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\n return true;\n } catch (e) {\n return false;\n }\n }\n\n get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return is.string(key) && key.length ? json[key] : json;\n }\n\n 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 window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from './../storage';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\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\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\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\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then(result => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport 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(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport i18n from './i18n';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements';\nimport { once } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom 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\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\n return false;\n }\n },\n\n // Create <svg> 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\n // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the <use> 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 } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a <button>\n createButton(buttonType, attr) {\n const button = createElement('button');\n const attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!is.array(this.elements.buttons[type])) {\n this.elements.buttons[type] = [];\n }\n\n this.elements.buttons[type].push(button);\n } else {\n this.elements.buttons[type] = button;\n }\n\n return button;\n },\n\n // Create an <input type='range'>\n createRange(type, attributes) {\n // Seek label\n const label = createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = createElement(\n 'input',\n extend(\n getAttributesFromSelector(this.config.selectors.inputs[type]),\n {\n type: 'range',\n min: 0,\n max: 100,\n step: 0.01,\n value: 0,\n autocomplete: 'off',\n // A11y fixes for https://github.com/sampotts/plyr/issues/905\n role: 'slider',\n 'aria-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a <progress>\n createProgress(type, attributes) {\n const progress = createElement(\n 'progress',\n extend(\n getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.innerText = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `plyr__time ${attributes.class}`,\n 'aria-label': i18n.get(type, this.config),\n }),\n '00:00',\n );\n\n // Reference for updates\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const item = createElement('li');\n\n const label = createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = createElement(\n 'input',\n extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\n },\n\n // Update the displayed time\n updateTimeDisplay(target = null, time = 0, inverted = false) {\n // Bail if there's no element to display or the value isn't a number\n if (!is.element(target) || !is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.innerText = formatTime(time, forceHours, inverted);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (is.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (is.element(this.elements.buttons.mute)) {\n toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!is.element(target)) {\n return;\n }\n\n // eslint-disable-next-line\n target.value = value;\n\n // Webkit range fill\n controls.updateRangeFill.call(this, target);\n },\n\n // Update <progress> elements\n updateProgress(event) {\n if (!this.supported.ui || !is.event(event)) {\n return;\n }\n\n let value = 0;\n\n const setProgress = (target, input) => {\n const value = is.number(input) ? input : 0;\n const progress = is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n };\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n case 'seeked':\n value = getPercentage(this.currentTime, this.duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\n },\n\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = is.event(target) ? target.target : target;\n\n // Needs to be a valid <input type='range'>\n if (!is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\n\n // WebKit only\n if (!browser.isWebkit) {\n return;\n }\n\n // Set CSS custom property\n range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n },\n\n // Update hover tooltip for seeking\n updateSeekTooltip(event) {\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is.element(this.elements.inputs.seek) || !is.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n } else {\n return;\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n // Set position\n this.elements.display.seekTooltip.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) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\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\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 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\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\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.toggleTab.call(this, type, toggle);\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 // Empty the menu\n emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\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\n controls.updateSetting.call(this, type, list);\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\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n value = this.currentTrack;\n break;\n\n default:\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 break;\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('ul');\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.tabs[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(`input[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.tabs.loop, false);\n toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\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\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n const tracks = captions.getTracks.call(this);\n\n // Toggle the pane and tab\n controls.toggleTab.call(this, type, tracks.length);\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 (!tracks.length) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.active && 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.active,\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n emptyElement(list);\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\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { tabs } = this.elements.settings;\n const visible = !is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(form) || !is.element(button)) {\n return;\n }\n\n const show = is.boolean(event) ? event : is.element(form) && form.hasAttribute('hidden');\n\n if (is.event(event)) {\n const isMenuItem = is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (is.element(form)) {\n toggleHidden(form, !show);\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(target = '') {\n const { menu } = this.elements.settings;\n const pane = document.getElementById(target);\n\n // Nothing to show, bail\n if (!is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n };\n\n // Listen for the transition finishing and restore auto height/width\n once(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 current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n toggleHidden(pane, false);\n\n const tabs = getElements.call(this, `[aria-controls=\"${target}\"]`);\n Array.from(tabs).forEach(tab => {\n tab.setAttribute('aria-expanded', true);\n });\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.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(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n const menu = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\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\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\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 (is.string(this.config.controls) || is.element(this.config.controls)) {\n // String or HTMLElement passed as the option\n container = this.config.controls;\n } else if (is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls.call(this, props);\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 update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([\n key,\n value,\n ]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n } else if (is.element(container)) {\n container.innerHTML = replace(container.innerHTML);\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\n if (is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default 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\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (e) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.statusText);\n });\n\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\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 */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n } catch (e) {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n if (!is.object(input)) {\n return '';\n }\n\n const params = new URLSearchParams();\n\n Object.entries(input).forEach(([\n key,\n value,\n ]) => {\n params.set(key, value);\n });\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst 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\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\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\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(url.protocol)) {\n fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n // Get language from storage, fallback to config\n let language = this.storage.get('language') || this.config.captions.language;\n if (language === 'auto') {\n [language] = (navigator.language || navigator.userLanguage).split('-');\n }\n // Set language and show if active\n captions.setLanguage.call(this, language, active);\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\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { language, meta } = this.captions;\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 // 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 track.mode = 'hidden';\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n const trackRemoved = !tracks.find(track => track === this.captions.currentTrackNode);\n const firstMatch = this.language !== language && tracks.find(track => track.language === language);\n\n // Update language if removed or first matching track added\n if (trackRemoved || firstMatch) {\n captions.setLanguage.call(this, language, this.config.captions.active);\n }\n\n // Enable or disable captions based on track length\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n // Update available languages in list\n if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n set(index, setLanguage = true, show = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n this.toggleCaptions(false);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = captions.getCurrentTrack.call(this);\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Prevent setting language in some cases, since it can violate user's intentions\n if (setLanguage) {\n this.captions.language = language;\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 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 // Show captions\n if (show) {\n this.toggleCaptions(true);\n }\n },\n\n setLanguage(language, show = true) {\n if (!is.string(language)) {\n this.debug.warn('Invalid language argument', language);\n return;\n }\n // Normalize\n this.captions.language = language.toLowerCase();\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.getCurrentTrack.call(this, true);\n captions.set.call(this, tracks.indexOf(track), false, show);\n },\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 => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack(fromLanguage = 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 return (!fromLanguage && tracks[this.currentTrack]) || sorted.find(track => track.language === this.captions.language) || sorted[0];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\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\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\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 || [])\n .map(cue => cue.getCueAsHTML())\n .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\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\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\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\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.3.12/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\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 options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\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\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\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 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 enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\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\n // URLs\n urls: {\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/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\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 fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\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',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\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 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', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\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 embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\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 hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\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 tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\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 },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.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\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\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// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n toggleState(button, this.active);\n }\n\n // Trigger an event\n triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction 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 // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\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 = { x: 0, y: 0 };\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 onChange.call(this);\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\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return 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.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} 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.enabled);\n }\n\n // Make an element fullscreen\n enter() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, 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\n // Toggle state\n toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n}\n\nexport default Fullscreen;\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\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass, toggleState } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst 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\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\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 speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.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 iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\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 && this.elements.poster && !this.elements.poster.style.backgroundImage) {\n ui.setPoster.call(this, this.poster);\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\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 // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\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\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\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n setPoster(poster) {\n // Set property regardless of validity\n this.media.setAttribute('poster', poster);\n\n // Bail if element is missing\n if (!is.element(this.elements.poster)) {\n return Promise.reject();\n }\n\n // Load the image, and set poster if successful\n const loadPromise = loadImage(poster).then(() => {\n this.elements.poster.style.backgroundImage = `url('${poster}')`;\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 // Hide the element if the poster can't be loaded (otherwise it will just be a black element covering the video)\n loadPromise.catch(() => ui.togglePoster.call(this, false));\n\n // Return the promise so the caller can use it as well\n return loadPromise;\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 ARIA state\n toggleState(this.elements.buttons.play, this.playing);\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\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls } = this.elements;\n\n if (controls && this.config.hideControls) {\n // Show controls if force, loading, paused, or button interaction, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport browser from './utils/browser';\nimport { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\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 code = event.keyCode ? event.keyCode : event.which;\n const pressed = event.type === 'keydown';\n const repeat = pressed && code === this.lastKey;\n\n // Bail if a modifier key is set\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n const seekByKey = () => {\n // Divide the max duration into 10th's and times by the number value\n this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = getFocusElement();\n if (is.element(focused) && (\n focused !== this.player.elements.inputs.seek &&\n matches(focused, this.player.config.selectors.editable))\n ) {\n return;\n }\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (code) {\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n // 0-9\n if (!repeat) {\n seekByKey();\n }\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.player.loop;\n break;\n\n /* case 73:\n this.setLoop('start');\n break;\n\n case 76:\n this.setLoop();\n break;\n\n case 79:\n this.setLoop('end');\n break; */\n\n default:\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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.player.fullscreen.toggle();\n }\n\n // Store last code for next cycle\n this.lastKey = code;\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 // Device is touch enabled\n firstTouch() {\n this.player.touch = true;\n\n // Add touch class\n toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n on.call(this.player, this.player.elements.container, 'focusout', event => {\n toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n // Add classname to tabbed elements\n on.call(this.player, this.player.elements.container, 'keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n toggleClass(getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const { controls } = this.player.elements;\n\n // Remove button states for fullscreen\n if (event.type === 'enterfullscreen') {\n controls.pressed = false;\n controls.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = [\n 'touchstart',\n 'touchmove',\n 'mousemove',\n ].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(this.player, true);\n // Use longer timeout for touch devices\n delay = this.player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(this.player.timers.controls);\n // Timer to prevent flicker when seeking\n this.player.timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n });\n }\n\n // Listen for media events\n media() {\n // Time change on media\n on.call(this.player, this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event));\n\n // Display duration\n on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n on.call(this.player, this.player.media, 'loadeddata', () => {\n toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(this.player, this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) {\n // Restart\n this.player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(this.player, this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event));\n\n // Handle volume changes\n on.call(this.player, this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event));\n\n // Handle play/pause\n on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n on.call(this.player, this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n on.call(this.player, this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(this.player, `.${this.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 ore restart\n on.call(this.player, wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n on.call(this.player,\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(this.player, this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n on.call(this.player, this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n on.call(this.player, this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n on.call(this.player, this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n on.call(this.player, this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n on.call(this.player, this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let {detail = {}} = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.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(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(this.player, element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n bind(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n bind(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n bind(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n bind(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n bind(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n bind(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n bind(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n bind(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n bind(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n bind(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n bind(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Go back to home tab on click\n const showHomeTab = () => {\n const id = `plyr-settings-${this.player.id}-home`;\n controls.showTab.call(this.player, id);\n };\n\n // Settings menu items - use event delegation as items are added/removed\n if (matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.currentTrack = Number(event.target.value);\n showHomeTab();\n },\n 'language',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n showHomeTab();\n },\n 'quality',\n );\n } else if (matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n showHomeTab();\n },\n 'speed',\n );\n } else {\n const tab = event.target;\n controls.showTab.call(this.player, tab.getAttribute('aria-controls'));\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n bind(this.player.elements.inputs.seek, 'mousedown mousemove', event => {\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n bind(this.player.elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n\n const code = event.keyCode ? event.keyCode : event.which;\n const eventType = event.type;\n\n if ((eventType === 'keydown' || eventType === 'keyup') && (code !== 39 && code !== 37)) {\n return;\n }\n // Was playing before?\n const play = seek.hasAttribute('play-on-seeked');\n\n // Done seeking\n const done = [\n 'mouseup',\n 'touchend',\n 'keyup',\n ].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute('play-on-seeked');\n this.player.play();\n } else if (!done && this.player.playing) {\n seek.setAttribute('play-on-seeked', '');\n this.player.pause();\n }\n });\n\n // Seek\n bind(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n const seek = event.currentTarget;\n\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n this.player.currentTime = seekTo / seek.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !is.element(this.player.elements.display.duration)) {\n bind(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n\n controls.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n bind(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n bind(getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n bind(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n bind(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n bind(this.player.elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = this.player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, event.type === 'focusin');\n\n // Toggle\n ui.toggleControls.call(this.player, event.type === 'focusin');\n\n // If focusin, hide again after delay\n if (event.type === 'focusin') {\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for keyboard users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(this.player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n bind(\n this.player.elements.inputs.volume,\n 'wheel',\n event => {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\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\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/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\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/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction 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 pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\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\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\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`\n 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 }\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/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\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);\n else return;\n }\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/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n 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\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\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 */\nloadjs.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\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from './../captions';\nimport controls from './../controls';\nimport ui from './../ui';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { format, stripHTML } from './../utils/strings';\nimport { buildUrlParams } from './../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst vimeo = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set intial ratio\n vimeo.setAspectRatio.call(this);\n\n // Load the API if not already\n if (!is.object(window.Vimeo)) {\n loadScript(this.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(this);\n })\n .catch(error => {\n this.debug.warn('Vimeo API failed to load', error);\n });\n } else {\n vimeo.ready.call(this);\n }\n },\n\n // Set aspect ratio\n // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n setAspectRatio(input) {\n const ratio = is.string(input) ? input.split(':') : this.config.ratio.split(':');\n const padding = 100 / ratio[0] * ratio[1];\n this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n if (this.supported.ui) {\n const height = 240;\n const offset = (height - padding) / (height / 50);\n\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n\n // Get Vimeo params for the iframe\n const options = {\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n // muted: player.muted,\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: 0,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n };\n const params = buildUrlParams(options);\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\n\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('allowtransparency', '');\n iframe.setAttribute('allow', 'autoplay');\n\n // Inject the package\n const wrapper = createElement('div', { class: player.config.classNames.embedContainer });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n\n // Get poster image\n fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n if (is.empty(response)) {\n return;\n }\n\n // Get the URL for thumbnail\n const url = new URL(response[0].thumbnail_large);\n\n // Get original image\n url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n // Set and show poster\n ui.setPoster.call(player, url.href);\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\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.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = 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 { embed, media, paused, volume } = 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))\n .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\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(error => {\n // Hide menu item (and menu if empty)\n if (error.name === 'Error') {\n controls.setSpeedMenu.call(player, []);\n }\n });\n },\n });\n\n // Volume\n let { volume } = 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 { muted } = 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\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = 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\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then(value => {\n currentSrc = value;\n })\n .catch(error => {\n this.debug.warn(error);\n });\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([\n player.embed.getVideoWidth(),\n player.embed.getVideoHeight(),\n ]).then(dimensions => {\n const ratio = getAspectRatio(dimensions[0], dimensions[1]);\n vimeo.setAspectRatio.call(this, ratio);\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\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\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\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\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\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\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\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 setTimeout(() => ui.build.call(player), 0);\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport controls from './../controls';\nimport ui from './../ui';\nimport { dedupe } from './../utils/arrays';\nimport { createElement, replaceElement, toggleClass } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport fetch from './../utils/fetch';\nimport is from './../utils/is';\nimport loadImage from './../utils/loadImage';\nimport loadScript from './../utils/loadScript';\nimport { format, generateId } from './../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n const qualities = {\n hd2160: 2160,\n hd1440: 1440,\n hd1080: 1080,\n hd720: 720,\n large: 480,\n medium: 360,\n small: 240,\n tiny: 144,\n };\n\n const entry = Object.entries(qualities).find(entry => entry.includes(input));\n\n if (entry) {\n // Get the match corresponding to the input\n return entry.find(value => value !== input);\n }\n\n return 'default';\n}\n\nfunction mapQualityUnits(levels) {\n if (is.empty(levels)) {\n return levels;\n }\n\n return dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction 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\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (is.string(key) && !is.empty(key)) {\n const url = format(this.config.urls.youtube.api, videoId, key);\n\n fetch(url)\n .then(result => {\n if (is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = 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 <div> if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the <iframe> with a <div> due to YouTube API issues\n const videoId = parseId(source);\n const id = generateId(player.provider);\n const container = createElement('div', { id });\n player.media = replaceElement(container, player.media);\n\n // Set poster image\n const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n .then(image => ui.setPoster.call(player, image.src))\n .then(posterSrc => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!posterSrc.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n });\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(id, {\n videoId,\n playerVars: {\n autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n disablekb: 1, // Disable keyboard as we handle it\n playsinline: 1, // Allow iOS inline playback\n\n // Tracking for stats\n // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n widget_referrer: window ? window.location.href : null,\n\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n },\n events: {\n onError(event) {\n // If we've already fired an error, don't do it again\n // YouTube fires onError twice\n if (is.object(player.media.error)) {\n return;\n }\n\n const detail = {\n code: event.data,\n };\n\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n switch (event.data) {\n case 2:\n detail.message =\n 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.';\n break;\n\n case 5:\n detail.message =\n 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.';\n break;\n\n case 100:\n detail.message =\n 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.';\n break;\n\n case 101:\n case 150:\n detail.message = 'The owner of the requested video does not allow it to be played in embedded players.';\n break;\n\n default:\n detail.message = 'An unknown error occured';\n break;\n }\n\n player.media.error = detail;\n\n triggerEvent.call(player, player.media, 'error');\n },\n onPlaybackQualityChange() {\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: player.media.quality,\n });\n },\n onPlaybackRateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Get current speed\n player.media.playbackRate = instance.getPlaybackRate();\n\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady(event) {\n // Get the instance\n const instance = event.target;\n\n // Get the title\n youtube.getTitle.call(player, videoId);\n\n // Create a faux HTML5 API using the YouTube API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = () => {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true;\n\n // Seeking\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return Number(instance.getCurrentTime());\n },\n set(time) {\n // If paused, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused) {\n player.embed.mute();\n }\n\n // Set seeking state and trigger event\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking');\n\n // Seek after events sent\n instance.seekTo(time);\n },\n });\n\n // Playback speed\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return instance.getPlaybackRate();\n },\n set(input) {\n instance.setPlaybackRate(input);\n },\n });\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n return mapQualityUnit(instance.getPlaybackQuality());\n },\n set(input) {\n instance.setPlaybackQuality(mapQualityUnit(input));\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n triggerEvent.call(player, player.media, 'volumechange');\n },\n });\n\n // Source\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return instance.getVideoUrl();\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Get available speeds\n player.options.speed = instance.getAvailablePlaybackRates();\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange');\n\n // Reset timer\n clearInterval(player.timers.buffering);\n\n // Setup buffering\n player.timers.buffering = setInterval(() => {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n }\n\n // Set last buffer point\n player.media.lastBuffered = player.media.buffered;\n\n // Bail if we're at 100%\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering);\n\n // Trigger event\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200);\n\n // Rebuild UI\n setTimeout(() => ui.build.call(player), 50);\n },\n onStateChange(event) {\n // Get the instance\n const instance = event.target;\n\n // Reset timer\n clearInterval(player.timers.playing);\n\n const seeked = player.media.seeking && [\n 1,\n 2,\n ].includes(event.data);\n\n if (seeked) {\n // Unset seeking and fire seeked event\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n }\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate');\n\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n\n break;\n\n case 0:\n assurePlaybackState.call(player, false);\n\n // YouTube doesn't support loop for a single video, so mimick it.\n if (player.media.loop) {\n // YouTube needs a call to `stopVideo` before playing again\n instance.stopVideo();\n instance.playVideo();\n } else {\n triggerEvent.call(player, player.media, 'ended');\n }\n\n break;\n\n case 1:\n // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n if (player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState.call(player, true);\n\n triggerEvent.call(player, player.media, 'playing');\n\n // Poll to get playback progress\n player.timers.playing = setInterval(() => {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (player.media.duration !== instance.getDuration()) {\n player.media.duration = instance.getDuration();\n triggerEvent.call(player, player.media, 'durationchange');\n }\n\n // Get quality\n controls.setQualityMenu.call(player, mapQualityUnits(instance.getAvailableQualityLevels()));\n }\n\n break;\n\n case 2:\n // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n if (!player.muted) {\n player.embed.unMute();\n }\n assurePlaybackState.call(player, false);\n\n break;\n\n default:\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data,\n });\n },\n },\n });\n },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n // Setup media\n setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n }\n\n // Add type class\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n // Add provider class\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n }\n\n // Inject the player wrapper\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video,\n });\n\n // Wrap the video in a container\n wrap(this.media, this.elements.wrapper);\n\n // Faux poster container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isEmbed) {\n switch (this.provider) {\n case 'youtube':\n youtube.setup.call(this);\n break;\n\n case 'vimeo':\n vimeo.setup.call(this);\n break;\n\n default:\n break;\n }\n } else if (this.isHTML5) {\n html5.extend.call(this);\n }\n },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport i18n from '../i18n';\nimport { createElement } from './../utils/elements';\nimport { triggerEvent } from './../utils/events';\nimport is from './../utils/is';\nimport loadScript from './../utils/loadScript';\nimport { formatTime } from './../utils/time';\nimport { buildUrlParams } from './../utils/urls';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.playing = false;\n this.initialized = false;\n this.elements = {\n container: null,\n displayContainer: null,\n };\n this.manager = null;\n this.loader = null;\n this.cuePoints = null;\n this.events = {};\n this.safetyTimer = null;\n this.countdownTimer = null;\n\n // Setup a promise to resolve when the IMA manager is ready\n this.managerPromise = new Promise((resolve, reject) => {\n // The ad is loaded and ready\n this.on('loaded', resolve);\n\n // Ads failed\n this.on('error', reject);\n });\n\n this.load();\n }\n\n get enabled() {\n return this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId);\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!is.object(window.google) || !is.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${buildUrlParams(params)}`;\n }\n\n /**\n * In order for the SDK to display ads for our video, we need to tell it where to put them,\n * so here we define our ad container. This div is set up to render on top of the video player.\n * Using the code below, we tell the SDK to render ads within that div. We also provide a\n * handle to the content video player - the SDK will poll the current time of our player to\n * properly place mid-rolls. After we create the ad display container, we initialize it. On\n * mobile devices, this initialization is done as the result of a user action.\n */\n setupIMA() {\n // Create the container for our advertisements\n this.elements.container = createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n // Mute based on current state\n request.setAdWillPlayMuted(!this.player.muted);\n\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n\n /**\n * Update the ad countdown\n * @param {boolean} start\n */\n pollCountdown(start = false) {\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n const update = () => {\n const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n this.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n onAdsManagerLoaded(event) {\n // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!is.empty(this.cuePoints)) {\n this.cuePoints.forEach(cuePoint => {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n const seekElement = this.player.elements.progress;\n\n if (is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = createElement('span', {\n class: this.player.config.classNames.cues,\n });\n\n cue.style.left = `${cuePercentage.toString()}%`;\n seekElement.appendChild(cue);\n }\n }\n });\n }\n\n // Get skippable state\n // TODO: Skip button\n // this.player.debug.warn(this.manager.getAdSkippableState());\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n triggerEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (is.array(handlers)) {\n handlers.forEach(handler => {\n if (is.function(handler)) {\n handler.apply(this, args);\n }\n });\n }\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n * @return {Ads}\n */\n on(event, callback) {\n if (!is.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n\n return this;\n }\n\n /**\n * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n * The advertisement has 12 seconds to get its things together. We stop this timer when the\n * advertisement is playing, or when a user action is required to start, then we clear the\n * timer on ad ready\n * @param {number} time\n * @param {string} from\n */\n startSafetyTimer(time, from) {\n this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n this.safetyTimer = setTimeout(() => {\n this.cancel();\n this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n\n /**\n * Clear our safety timer(s)\n * @param {string} from\n */\n clearSafetyTimer(from) {\n if (!is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\n\nconst source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements(type, attributes) {\n if (is.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes,\n });\n } else if (is.array(attributes)) {\n attributes.forEach(attribute => {\n insertElement(type, this.media, attribute);\n });\n }\n },\n\n // Update source\n // Sources are not checked for support so be careful\n change(input) {\n if (!is.object(input) || !('sources' in input) || !input.sources.length) {\n this.debug.warn('Invalid source format');\n return;\n }\n\n // Cancel current network requests\n html5.cancelRequests.call(this);\n\n // Destroy instance and re-setup\n this.destroy.call(\n this,\n () => {\n // Reset quality options\n this.options.quality = [];\n\n // Remove elements\n removeElement(this.media);\n this.media = null;\n\n // Reset class name\n if (is.element(this.elements.container)) {\n this.elements.container.removeAttribute('class');\n }\n\n // Set the type and provider\n this.type = input.type;\n this.provider = !is.empty(input.sources[0].provider) ? input.sources[0].provider : providers.html5;\n\n // Check for support\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // Create new markup\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n this.media = createElement('video');\n break;\n\n case 'html5:audio':\n this.media = createElement('audio');\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n this.media = createElement('div', {\n src: input.sources[0].src,\n });\n break;\n\n default:\n break;\n }\n\n // Inject the new element\n this.elements.container.appendChild(this.media);\n\n // Autoplay the new source?\n if (is.boolean(input.autoplay)) {\n this.config.autoplay = input.autoplay;\n }\n\n // Set attributes for audio and video\n if (this.isHTML5) {\n if (this.config.crossorigin) {\n this.media.setAttribute('crossorigin', '');\n }\n if (this.config.autoplay) {\n this.media.setAttribute('autoplay', '');\n }\n if (!is.empty(input.poster)) {\n this.poster = input.poster;\n }\n if (this.config.loop.active) {\n this.media.setAttribute('loop', '');\n }\n if (this.config.muted) {\n this.media.setAttribute('muted', '');\n }\n if (this.config.playsinline) {\n this.media.setAttribute('playsinline', '');\n }\n }\n\n // Restore class hook\n ui.addStyleHook.call(this);\n\n // Set new sources for html5\n if (this.isHTML5) {\n source.insertElements.call(this, 'source', input.sources);\n }\n\n // Set video title\n this.config.title = input.title;\n\n // Set up from scratch\n media.setup.call(this);\n\n // HTML5 stuff\n if (this.isHTML5) {\n // Setup captions\n if ('tracks' in input) {\n source.insertElements.call(this, 'track', input.tracks);\n }\n\n // Load HTML5 sources\n this.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n // Setup interface\n ui.build.call(this);\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.3.12\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n constructor(target, options) {\n this.timers = {};\n\n // State\n this.ready = false;\n this.loading = false;\n this.failed = false;\n\n // Touch device\n this.touch = support.touch;\n\n // Set the media element\n this.media = target;\n\n // String selector passed\n if (is.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n }\n\n // jQuery, NodeList or Array passed, use first element\n if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n }\n\n // Set config\n this.config = extend(\n {},\n defaults,\n Plyr.defaults,\n options || {},\n (() => {\n try {\n return JSON.parse(this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n })(),\n );\n\n // Elements cache\n this.elements = {\n container: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n menu: null,\n panes: {},\n tabs: {},\n },\n captions: null,\n };\n\n // Captions\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap(),\n };\n\n // Fullscreen\n this.fullscreen = {\n active: false,\n };\n\n // Options\n this.options = {\n speed: [],\n quality: [],\n };\n\n // Debugging\n // TODO: move to globals\n this.debug = new Console(this.config.debug);\n\n // Log config options and support\n this.debug.log('Config', this.config);\n this.debug.log('Support', support);\n\n // We need an element to setup\n if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n }\n\n // Bail if the element is initialized\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n }\n\n // Bail if not enabled\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n // Cache original element state for .destroy()\n const clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone;\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n const type = this.media.tagName.toLowerCase();\n\n // Embed properties\n let iframe = null;\n let url = null;\n\n // Different setup based on type\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe');\n\n // <iframe> type\n if (is.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString());\n\n // Rework elements\n this.elements.container = this.media;\n this.media = iframe;\n\n // Reset classname\n this.elements.container.className = '';\n\n // Get attributes from URL and set config\n if (url.searchParams.length) {\n const truthy = [\n '1',\n 'true',\n ];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n }\n\n // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n } else {\n this.config.playsinline = true;\n }\n }\n } else {\n // <div> with attributes\n this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n // Remove attribute\n this.media.removeAttribute(this.config.attributes.embed.provider);\n }\n\n // Unsupported or missing provider\n if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n }\n\n // Audio will come later for external providers\n this.type = types.video;\n\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5;\n\n // Get config from attributes\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n if (this.media.hasAttribute('playsinline')) {\n this.config.playsinline = true;\n }\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\n if (this.media.hasAttribute('loop')) {\n this.config.loop.active = true;\n }\n\n break;\n\n default:\n this.debug.error('Setup failed: unsupported type');\n return;\n }\n\n // Check for support again but with type\n this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n // If no support for even API, bail\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = [];\n\n // Create listeners\n this.listeners = new Listeners(this);\n\n // Setup local storage for user settings\n this.storage = new Storage(this);\n\n // Store reference\n this.media.plyr = this;\n\n // Wrap media\n if (!is.element(this.elements.container)) {\n this.elements.container = createElement('div');\n wrap(this.media, this.elements.container);\n }\n\n // Allow focus to be captured\n this.elements.container.setAttribute('tabindex', 0);\n\n // Add style hook\n ui.addStyleHook.call(this);\n\n // Setup media\n media.setup.call(this);\n\n // Listen for events if debugging\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), event => {\n this.debug.log(`event: ${event.type}`);\n });\n }\n\n // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n ui.build.call(this);\n }\n\n // Container listeners\n this.listeners.container();\n\n // Global listeners\n this.listeners.global();\n\n // Setup fullscreen\n this.fullscreen = new Fullscreen(this);\n\n // Setup ads if provided\n this.ads = new Ads(this);\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return Boolean(this.provider === providers.html5);\n }\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n get isVideo() {\n return Boolean(this.type === types.video);\n }\n get isAudio() {\n return Boolean(this.type === types.audio);\n }\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n play() {\n if (!is.function(this.media.play)) {\n return null;\n }\n\n // Return the promise (for HTML5)\n return this.media.play();\n }\n\n /**\n * Pause the media\n */\n pause() {\n if (!this.playing || !is.function(this.media.pause)) {\n return;\n }\n\n this.media.pause();\n }\n\n /**\n * Get playing state\n */\n get playing() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n\n /**\n * Get paused state\n */\n get paused() {\n return Boolean(this.media.paused);\n }\n\n /**\n * Get stopped state\n */\n get stopped() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n\n /**\n * Get ended state\n */\n get ended() {\n return Boolean(this.media.ended);\n }\n\n /**\n * Toggle playback based on current status\n * @param {boolean} input\n */\n togglePlay(input) {\n // Toggle based on current state if nothing passed\n const toggle = is.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n this.play();\n } else {\n this.pause();\n }\n }\n\n /**\n * Stop playback\n */\n stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is.function(this.media.stop)) {\n this.media.stop();\n }\n }\n\n /**\n * Restart playback\n */\n restart() {\n this.currentTime = 0;\n }\n\n /**\n * Rewind\n * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n rewind(seekTime) {\n this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Fast forward\n * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n forward(seekTime) {\n this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n }\n\n /**\n * Seek to a time\n * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n set currentTime(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n }\n\n // Validate input\n const inputIsValid = is.number(input) && input > 0;\n\n // Set\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n // Logging\n this.debug.log(`Seeking to ${this.currentTime} seconds`);\n }\n\n /**\n * Get current time\n */\n get currentTime() {\n return Number(this.media.currentTime);\n }\n\n /**\n * Get buffered\n */\n get buffered() {\n const { buffered } = this.media;\n\n // YouTube / Vimeo return a float between 0-1\n if (is.number(buffered)) {\n return buffered;\n }\n\n // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n\n /**\n * Get seeking status\n */\n get seeking() {\n return Boolean(this.media.seeking);\n }\n\n /**\n * Get the duration of the current media\n */\n get duration() {\n // Faux duration set via config\n const fauxDuration = parseFloat(this.config.duration);\n\n // Media duration can be NaN before the media has loaded\n const duration = (this.media || {}).duration || 0;\n\n // If config duration is funky, use regular duration\n return fauxDuration || duration;\n }\n\n /**\n * Set the player volume\n * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n */\n set volume(value) {\n let volume = value;\n const max = 1;\n const min = 0;\n\n if (is.string(volume)) {\n volume = Number(volume);\n }\n\n // Load volume from storage if no value specified\n if (!is.number(volume)) {\n volume = this.storage.get('volume');\n }\n\n // Use config if all else fails\n if (!is.number(volume)) {\n ({ volume } = this.config);\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Update config\n this.config.volume = volume;\n\n // Set the player volume\n this.media.volume = volume;\n\n // If muted, and we're increasing volume manually, reset muted state\n if (!is.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n\n /**\n * Get the current player volume\n */\n get volume() {\n return Number(this.media.volume);\n }\n\n /**\n * Increase volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n increaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is.number(step) ? step : 1);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n const volume = this.media.muted ? 0 : this.volume;\n this.volume = volume - (is.number(step) ? step : 1);\n }\n\n /**\n * Set muted state\n * @param {boolean} mute\n */\n set muted(mute) {\n let toggle = mute;\n\n // Load muted state from storage\n if (!is.boolean(toggle)) {\n toggle = this.storage.get('muted');\n }\n\n // Use config if all else fails\n if (!is.boolean(toggle)) {\n toggle = this.config.muted;\n }\n\n // Update config\n this.config.muted = toggle;\n\n // Set mute on the player\n this.media.muted = toggle;\n }\n\n /**\n * Get current muted state\n */\n get muted() {\n return Boolean(this.media.muted);\n }\n\n /**\n * Check if the media has audio\n */\n get hasAudio() {\n // Assume yes for all non HTML5 (as we can't tell...)\n if (!this.isHTML5) {\n return true;\n }\n\n if (this.isAudio) {\n return true;\n }\n\n // Get audio tracks\n return (\n Boolean(this.media.mozHasAudio) ||\n Boolean(this.media.webkitAudioDecodedByteCount) ||\n Boolean(this.media.audioTracks && this.media.audioTracks.length)\n );\n }\n\n /**\n * Set playback speed\n * @param {number} speed - the speed of playback (0.5-2.0)\n */\n set speed(input) {\n let speed = null;\n\n if (is.number(input)) {\n speed = input;\n }\n\n if (!is.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is.number(speed)) {\n speed = this.config.speed.selected;\n }\n\n // Set min/max\n if (speed < 0.1) {\n speed = 0.1;\n }\n if (speed > 2.0) {\n speed = 2.0;\n }\n\n if (!this.config.speed.options.includes(speed)) {\n this.debug.warn(`Unsupported speed (${speed})`);\n return;\n }\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n this.media.playbackRate = speed;\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {number} input - Quality level\n */\n set quality(input) {\n const config = this.config.quality;\n const options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n let quality = ([\n !is.empty(input) && Number(input),\n this.storage.get('quality'),\n config.selected,\n config.default,\n ]).find(is.number);\n\n if (!options.includes(quality)) {\n const value = closest(options, quality);\n this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n quality = value;\n }\n\n // Trigger request event\n triggerEvent.call(this, this.media, 'qualityrequested', false, { quality });\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n }\n\n /**\n * Get current quality level\n */\n get quality() {\n return this.media.quality;\n }\n\n /**\n * Toggle loop\n * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n * @param {boolean} input - Whether to loop or not\n */\n set loop(input) {\n const toggle = is.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle;\n\n // Set default to be a true toggle\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n switch (type) {\n case 'start':\n if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n this.config.loop.end = null;\n }\n this.config.loop.start = this.currentTime;\n // this.config.loop.indicator.start = this.elements.display.played.value;\n break;\n\n case 'end':\n if (this.config.loop.start >= this.currentTime) {\n return this;\n }\n this.config.loop.end = this.currentTime;\n // this.config.loop.indicator.end = this.elements.display.played.value;\n break;\n\n case 'all':\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n this.config.loop.indicator.start = 0;\n this.config.loop.indicator.end = 100;\n break;\n\n case 'toggle':\n if (this.config.loop.active) {\n this.config.loop.start = 0;\n this.config.loop.end = null;\n } else {\n this.config.loop.start = 0;\n this.config.loop.end = this.duration - 2;\n }\n break;\n\n default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n\n /**\n * Get current loop state\n */\n get loop() {\n return Boolean(this.media.loop);\n }\n\n /**\n * Set new media source\n * @param {object} input - The new source object (see docs)\n */\n set source(input) {\n source.change.call(this, input);\n }\n\n /**\n * Get current source\n */\n get source() {\n return this.media.currentSrc;\n }\n\n /**\n * Set the poster image for a video\n * @param {input} - the URL for the new poster image\n */\n set poster(input) {\n if (!this.isVideo) {\n this.debug.warn('Poster can only be set for video');\n return;\n }\n\n ui.setPoster.call(this, input);\n }\n\n /**\n * Get the current poster image\n */\n get poster() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster');\n }\n\n /**\n * Set the autoplay state\n * @param {boolean} input - Whether to autoplay or not\n */\n set autoplay(input) {\n const toggle = is.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n\n /**\n * Get the current autoplay state\n */\n get autoplay() {\n return Boolean(this.config.autoplay);\n }\n\n /**\n * Toggle captions\n * @param {boolean} input - Whether to enable captions\n */\n toggleCaptions(input) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n const active = is.boolean(input) ? input : !this.elements.container.classList.contains(this.config.classNames.captions.active);\n\n // Toggle state\n toggleState(this.elements.buttons.captions, active);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.captions.active, active);\n\n // Update state and trigger event\n if (active !== this.captions.active) {\n this.captions.active = active;\n triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled');\n }\n }\n\n /**\n * Set the caption track by index\n * @param {number} - Caption index\n */\n set currentTrack(input) {\n captions.set.call(this, input);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { active, currentTrack } = this.captions;\n return active ? currentTrack : -1;\n }\n\n /**\n * Set the wanted language for captions\n * Since tracks can be added later it won't update the actual caption track until there is a matching track\n * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n */\n set language(input) {\n captions.setLanguage.call(this, input);\n }\n\n /**\n * Get the current track's language\n */\n get language() {\n return (captions.getCurrentTrack.call(this) || {}).language;\n }\n\n /**\n * Toggle picture-in-picture playback on WebKit/MacOS\n * TODO: update player with state, support, enabled\n * TODO: detect outside changes\n */\n set pip(input) {\n const states = {\n pip: 'picture-in-picture',\n inline: 'inline',\n };\n\n // Bail if no support\n if (!support.pip) {\n return;\n }\n\n // Toggle based on current state if not passed\n const toggle = is.boolean(input) ? input : this.pip === states.inline;\n\n // Toggle based on current state\n this.media.webkitSetPresentationMode(toggle ? states.pip : states.inline);\n }\n\n /**\n * Get the current picture-in-picture state\n */\n get pip() {\n if (!support.pip) {\n return null;\n }\n\n return this.media.webkitPresentationMode;\n }\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n\n /**\n * Toggle the player controls\n * @param {boolean} [toggle] - Whether to show the controls\n */\n toggleControls(toggle) {\n // Don't toggle if missing UI support or if it's audio\n if (this.supported.ui && !this.isAudio) {\n // Get state before change\n const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n }\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n return !hiding;\n }\n return false;\n }\n\n /**\n * Add event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n on(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n once(event, callback) {\n once(this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {string} event - Event type\n * @param {function} callback - Callback for when event occurs\n */\n off(event, callback) {\n off(this.elements.container, event, callback);\n }\n\n /**\n * Destroy an instance\n * Event listeners are removed when elements are removed\n * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n * @param {function} callback - Callback for when destroy is complete\n * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n */\n destroy(callback, soft = false) {\n if (!this.ready) {\n return;\n }\n\n const done = () => {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = '';\n\n // GC for embed\n this.embed = null;\n\n // If it's a soft destroy, make minimal changes\n if (soft) {\n if (Object.keys(this.elements).length) {\n // Remove elements\n removeElement(this.elements.buttons.play);\n removeElement(this.elements.captions);\n removeElement(this.elements.controls);\n removeElement(this.elements.wrapper);\n\n // Clear for GC\n this.elements.buttons.play = null;\n this.elements.captions = null;\n this.elements.controls = null;\n this.elements.wrapper = null;\n }\n\n // Callback\n if (is.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(this);\n\n // Replace the container with the original element provided\n replaceElement(this.elements.original, this.elements.container);\n\n // Event\n triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n // Callback\n if (is.function(callback)) {\n callback.call(this.elements.original);\n }\n\n // Reset state\n this.ready = false;\n\n // Clear for garbage collection\n setTimeout(() => {\n this.elements = null;\n this.media = null;\n }, 200);\n }\n };\n\n // Stop playback\n this.stop();\n\n // Type specific stuff\n switch (`${this.provider}:${this.type}`) {\n case 'html5:video':\n case 'html5:audio':\n // Clear timeout\n clearTimeout(this.timers.loading);\n\n // Restore native video controls\n ui.toggleNativeControls.call(this, true);\n\n // Clean up\n done();\n\n break;\n\n case 'youtube:video':\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing);\n\n // Destroy YouTube API\n if (this.embed !== null && is.function(this.embed.destroy)) {\n this.embed.destroy();\n }\n\n // Clean up\n done();\n\n break;\n\n case 'vimeo:video':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n if (this.embed !== null) {\n this.embed.unload().then(done);\n }\n\n // Vimeo does not always return\n setTimeout(done, 200);\n\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {string} type - Mime type\n */\n supports(type) {\n return support.mime.call(this, type);\n }\n\n /**\n * Check for support\n * @param {string} type - Player type (audio/video)\n * @param {string} provider - Provider (html5/youtube/vimeo)\n * @param {bool} inline - Where player has `playsinline` sttribute\n */\n static supported(type, provider, inline) {\n return support.check(type, provider, inline);\n }\n\n /**\n * Load an SVG sprite into the page\n * @param {string} url - URL for the SVG sprite\n * @param {string} [id] - Unique ID\n */\n static loadSprite(url, id) {\n return loadSprite(url, id);\n }\n\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {object} options\n */\n static setup(selector, options = {}) {\n let targets = null;\n\n if (is.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is.array(selector)) {\n targets = selector.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n return targets.map(t => new Plyr(t, options));\n }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}
\ No newline at end of file @@ -215,7 +215,7 @@ You can specify a range of arguments for the constructor to use: * A CSS string selector that's compatible with [`querySelector`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector) * A [`HTMLElement`](https://developer.mozilla.org/en/docs/Web/API/HTMLElement) -* A [`NodeList]`(https://developer.mozilla.org/en-US/docs/Web/API/NodeList) +* A [`NodeList`](https://developer.mozilla.org/en-US/docs/Web/API/NodeList) * A [jQuery](https://jquery.com) object _Note_: If a `NodeList`, `Array`, or jQuery object are passed, the first element will be used for setup. To setup multiple players, see [setting up multiple players](#setting-up-multiple-players) below. @@ -367,6 +367,7 @@ player.fullscreen.enter(); // Enter fullscreen | `airplay()` | - | Trigger the airplay dialog on supported devices. | | `toggleControls(toggle)` | Boolean | Toggle the controls (video only). Takes optional truthy value to force it on/off. | | `on(event, function)` | String, Function | Add an event listener for the specified event. | +| `once(event, function)` | String, Function | Add an event listener for the specified event once. | | `off(event, function)` | String, Function | Remove an event listener for the specified event. | | `supports(type)` | String | Check support for a mime type. | | `destroy()` | - | Destroy the instance and garbage collect any elements. | diff --git a/src/js/captions.js b/src/js/captions.js index 0506d1e6..6682d6f0 100644 --- a/src/js/captions.js +++ b/src/js/captions.js @@ -8,7 +8,7 @@ import i18n from './i18n'; import support from './support'; import browser from './utils/browser'; import { createElement, emptyElement, getAttributesFromSelector, insertAfter, removeElement, toggleClass } from './utils/elements'; -import { on, trigger } from './utils/events'; +import { on, triggerEvent } from './utils/events'; import fetch from './utils/fetch'; import is from './utils/is'; import { getHTML } from './utils/strings'; @@ -82,7 +82,7 @@ const captions = { // Watch changes to textTracks and update captions menu if (this.isHTML5) { const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack'; - on(this.media.textTracks, trackEvents, captions.update.bind(this)); + on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this)); } // Update available languages in list next tick (the event must not be triggered before the listeners) @@ -107,7 +107,7 @@ const captions = { track.mode = 'hidden'; // Add event listener for cue changes - on(track, 'cuechange', () => captions.updateCues.call(this)); + on.call(this, track, 'cuechange', () => captions.updateCues.call(this)); }); } @@ -166,7 +166,7 @@ const captions = { } // Trigger event - trigger.call(this, this.media, 'languagechange'); + triggerEvent.call(this, this.media, 'languagechange'); } if (this.isHTML5 && this.isVideo) { @@ -280,7 +280,7 @@ const captions = { this.elements.captions.appendChild(caption); // Trigger event - trigger.call(this, this.media, 'cuechange'); + triggerEvent.call(this, this.media, 'cuechange'); } }, }; diff --git a/src/js/controls.js b/src/js/controls.js index cfab26bc..6d15e486 100644 --- a/src/js/controls.js +++ b/src/js/controls.js @@ -7,9 +7,10 @@ import html5 from './html5'; import i18n from './i18n'; import support from './support'; import { repaint, transitionEndEvent } from './utils/animation'; +import { dedupe } from './utils/arrays'; import browser from './utils/browser'; import { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, removeElement, setAttributes, toggleClass, toggleHidden, toggleState } from './utils/elements'; -import { off, on } from './utils/events'; +import { once } from './utils/events'; import is from './utils/is'; import loadSprite from './utils/loadSprite'; import { extend } from './utils/objects'; @@ -634,7 +635,6 @@ const controls = { }, // Set the quality menu - // TODO: Vimeo support setQualityMenu(options) { // Menu required if (!is.element(this.elements.settings.panes.quality)) { @@ -644,9 +644,9 @@ const controls = { const type = 'quality'; const list = this.elements.settings.panes.quality.querySelector('ul'); - // Set options if passed and filter based on config + // Set options if passed and filter based on uniqueness and config if (is.array(options)) { - this.options.quality = options.filter(quality => this.config.quality.options.includes(quality)); + this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality)); } // Toggle the pane and tab @@ -1065,12 +1065,10 @@ const controls = { container.style.width = ''; container.style.height = ''; - // Only listen once - off(container, transitionEndEvent, restore); }; // Listen for the transition finishing and restore auto height/width - on(container, transitionEndEvent, restore); + once(container, transitionEndEvent, restore); // Set dimensions to target container.style.width = `${size.width}px`; diff --git a/src/js/fullscreen.js b/src/js/fullscreen.js index 180853c5..998dc613 100644 --- a/src/js/fullscreen.js +++ b/src/js/fullscreen.js @@ -5,7 +5,7 @@ import browser from './utils/browser'; import { hasClass, toggleClass, toggleState, trapFocus } from './utils/elements'; -import { on, trigger } from './utils/events'; +import { on, triggerEvent } from './utils/events'; import is from './utils/is'; function onChange() { @@ -20,7 +20,7 @@ function onChange() { } // Trigger an event - trigger.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); + triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container if (!browser.isIos) { @@ -63,13 +63,13 @@ class Fullscreen { // Register event listeners // Handle event (incase user presses escape etc) - on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => { + on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => { // TODO: Filter for target?? onChange.call(this); }); // Fullscreen toggle on double click - on(this.player.elements.container, 'dblclick', event => { + on.call(this.player, this.player.elements.container, 'dblclick', event => { // Ignore double click in controls if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) { return; diff --git a/src/js/html5.js b/src/js/html5.js index d13e6aa6..6aa96f4c 100644 --- a/src/js/html5.js +++ b/src/js/html5.js @@ -3,43 +3,28 @@ // ========================================================================== import support from './support'; -import { dedupe } from './utils/arrays'; import { removeElement } from './utils/elements'; -import { trigger } from './utils/events'; -import is from './utils/is'; +import { triggerEvent } from './utils/events'; const html5 = { getSources() { if (!this.isHTML5) { - return null; + return []; } - return this.media.querySelectorAll('source'); + const sources = Array.from(this.media.querySelectorAll('source')); + + // Filter out unsupported sources + return sources.filter(source => support.mime.call(this, source.getAttribute('type'))); }, // Get quality levels getQualityOptions() { - if (!this.isHTML5) { - return null; - } - - // Get sources - const sources = html5.getSources.call(this); - - if (is.empty(sources)) { - return null; - } - - // Get <source> with size attribute - const sizes = Array.from(sources).filter(source => !is.empty(source.getAttribute('size'))); - - // If none, bail - if (is.empty(sizes)) { - return null; - } - - // Reduce to unique list - return dedupe(sizes.map(source => Number(source.getAttribute('size')))); + // Get sizes from <source> elements + return html5.getSources + .call(this) + .map(source => Number(source.getAttribute('size'))) + .filter(Boolean); }, extend() { @@ -54,60 +39,34 @@ const html5 = { get() { // Get sources const sources = html5.getSources.call(player); + const [source] = sources.filter(source => source.getAttribute('src') === player.source); - if (is.empty(sources)) { - return null; - } - - const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source); - - if (is.empty(matches)) { - return null; - } - - return Number(matches[0].getAttribute('size')); + // Return size, if match is found + return source && Number(source.getAttribute('size')); }, set(input) { // Get sources const sources = html5.getSources.call(player); - if (is.empty(sources)) { - return; - } + // Get first match for requested size + const source = sources.find(source => Number(source.getAttribute('size')) === input); - // Get matches for requested size - const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input); - - // No matches for requested size - if (is.empty(matches)) { + // No matching source found + if (!source) { return; } - // Get supported sources - const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type'))); - - // No supported sources - if (is.empty(supported)) { - return; - } - - // Trigger change event - trigger.call(player, player.media, 'qualityrequested', false, { - quality: input, - }); - // Get current state const { currentTime, playing } = player; // Set new source - player.media.src = supported[0].getAttribute('src'); + player.media.src = source.getAttribute('src'); // Restore time const onLoadedMetaData = () => { player.currentTime = currentTime; - player.off('loadedmetadata', onLoadedMetaData); }; - player.on('loadedmetadata', onLoadedMetaData); + player.once('loadedmetadata', onLoadedMetaData); // Load new source player.media.load(); @@ -118,7 +77,7 @@ const html5 = { } // Trigger change event - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: input, }); }, @@ -133,7 +92,7 @@ const html5 = { } // Remove child sources - removeElement(html5.getSources()); + removeElement(html5.getSources.call(this)); // Set blank video src attribute // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error diff --git a/src/js/listeners.js b/src/js/listeners.js index b3cc3779..65d24277 100644 --- a/src/js/listeners.js +++ b/src/js/listeners.js @@ -6,7 +6,7 @@ import controls from './controls'; import ui from './ui'; import browser from './utils/browser'; import { getElement, getElements, getFocusElement, matches, toggleClass, toggleHidden } from './utils/elements'; -import { off, on, toggleListener, trigger } from './utils/events'; +import { on, once, toggleListener, triggerEvent } from './utils/events'; import is from './utils/is'; class Listeners { @@ -197,39 +197,36 @@ class Listeners { // Add touch class toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true); - // Clean up - off(document.body, 'touchstart', this.firstTouch); } // Global window & document listeners global(toggle = true) { // Keyboard shortcuts if (this.player.config.keyboard.global) { - toggleListener(window, 'keydown keyup', this.handleKey, toggle, false); + toggleListener.call(this.player, window, 'keydown keyup', this.handleKey, toggle, false); } // Click anywhere closes menu - toggleListener(document.body, 'click', this.toggleMenu, toggle); + toggleListener.call(this.player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events - on(document.body, 'touchstart', this.firstTouch); + once(document.body, 'touchstart', this.firstTouch); } // Container listeners container() { // Keyboard shortcuts if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) { - on(this.player.elements.container, 'keydown keyup', this.handleKey, false); + on.call(this.player, this.player.elements.container, 'keydown keyup', this.handleKey, false); } // Detect tab focus // Remove class on blur/focusout - on(this.player.elements.container, 'focusout', event => { + on.call(this.player, this.player.elements.container, 'focusout', event => { toggleClass(event.target, this.player.config.classNames.tabFocus, false); }); - // Add classname to tabbed elements - on(this.player.elements.container, 'keydown', event => { + on.call(this.player, this.player.elements.container, 'keydown', event => { if (event.keyCode !== 9) { return; } @@ -242,7 +239,7 @@ class Listeners { }); // Toggle controls on mouse events and entering fullscreen - on(this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => { + on.call(this.player, this.player.elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => { const { controls } = this.player.elements; // Remove button states for fullscreen @@ -276,20 +273,20 @@ class Listeners { // Listen for media events media() { // Time change on media - on(this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event)); + on.call(this.player, this.player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(this.player, event)); // Display duration - on(this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event)); + on.call(this.player, this.player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(this.player, event)); // Check for audio tracks on load // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point - on(this.player.media, 'loadeddata canplay', () => { + on.call(this.player, this.player.media, 'canplay', () => { toggleHidden(this.player.elements.volume, !this.player.hasAudio); toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio); }); // Handle the media finishing - on(this.player.media, 'ended', () => { + on.call(this.player, this.player.media, 'ended', () => { // Show poster on end if (this.player.isHTML5 && this.player.isVideo && this.player.config.resetOnEnd) { // Restart @@ -298,20 +295,20 @@ class Listeners { }); // Check for buffer progress - on(this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event)); + on.call(this.player, this.player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(this.player, event)); // Handle volume changes - on(this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event)); + on.call(this.player, this.player.media, 'volumechange', event => controls.updateVolume.call(this.player, event)); // Handle play/pause - on(this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event)); + on.call(this.player, this.player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(this.player, event)); // Loading state - on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event)); + on.call(this.player, this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event)); // If autoplay, then load advertisement if required // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows - on(this.player.media, 'playing', () => { + on.call(this.player, this.player.media, 'playing', () => { if (!this.player.ads) { return; } @@ -334,7 +331,7 @@ class Listeners { } // On click play, pause ore restart - on(wrapper, 'click', () => { + on.call(this.player, wrapper, 'click', () => { // Touch devices will just show controls (if we're hiding controls) if (this.player.config.hideControls && this.player.touch && !this.player.paused) { return; @@ -353,7 +350,7 @@ class Listeners { // Disable right click if (this.player.supported.ui && this.player.config.disableContextMenu) { - on( + on.call(this.player, this.player.elements.wrapper, 'contextmenu', event => { @@ -364,13 +361,13 @@ class Listeners { } // Volume change - on(this.player.media, 'volumechange', () => { + on.call(this.player, this.player.media, 'volumechange', () => { // Save to storage this.player.storage.set({ volume: this.player.volume, muted: this.player.muted }); }); // Speed change - on(this.player.media, 'ratechange', () => { + on.call(this.player, this.player.media, 'ratechange', () => { // Update UI controls.updateSetting.call(this.player, 'speed'); @@ -379,19 +376,19 @@ class Listeners { }); // Quality request - on(this.player.media, 'qualityrequested', event => { + on.call(this.player, this.player.media, 'qualityrequested', event => { // Save to storage this.player.storage.set({ quality: event.detail.quality }); }); // Quality change - on(this.player.media, 'qualitychange', event => { + on.call(this.player, this.player.media, 'qualitychange', event => { // Update UI controls.updateSetting.call(this.player, 'quality', null, event.detail.quality); }); // Caption language change - on(this.player.media, 'languagechange', () => { + on.call(this.player, this.player.media, 'languagechange', () => { // Update UI controls.updateSetting.call(this.player, 'captions'); @@ -400,7 +397,7 @@ class Listeners { }); // Captions toggle - on(this.player.media, 'captionsenabled captionsdisabled', () => { + on.call(this.player, this.player.media, 'captionsenabled captionsdisabled', () => { // Update UI controls.updateSetting.call(this.player, 'captions'); @@ -410,7 +407,7 @@ class Listeners { // Proxy events to container // Bubble up key events for Edge - on(this.player.media, this.player.config.events.concat([ + on.call(this.player, this.player.media, this.player.config.events.concat([ 'keyup', 'keydown', ]).join(' '), event => { @@ -421,7 +418,7 @@ class Listeners { detail = this.player.media.error; } - trigger.call(this.player, this.player.elements.container, event.type, true, detail); + triggerEvent.call(this.player, this.player.elements.container, event.type, true, detail); }); } @@ -452,7 +449,7 @@ class Listeners { const customHandler = this.player.config.listeners[customHandlerKey]; const hasCustomHandler = is.function(customHandler); - on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler); + on.call(this.player, element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler); }; // Play/pause toggle @@ -727,11 +724,6 @@ class Listeners { false, ); } - - // Reset on destroy - clear() { - this.global(false); - } } export default Listeners; diff --git a/src/js/plugins/ads.js b/src/js/plugins/ads.js index 07eee58f..19df7666 100644 --- a/src/js/plugins/ads.js +++ b/src/js/plugins/ads.js @@ -8,7 +8,7 @@ import i18n from '../i18n'; import { createElement } from './../utils/elements'; -import { trigger } from './../utils/events'; +import { triggerEvent } from './../utils/events'; import is from './../utils/is'; import loadScript from './../utils/loadScript'; import { formatTime } from './../utils/time'; @@ -270,7 +270,7 @@ class Ads { // Proxy event const dispatchEvent = type => { const event = `ads${type.replace(/_/g, '').toLowerCase()}`; - trigger.call(this.player, this.player.media, event); + triggerEvent.call(this.player, this.player.media, event); }; switch (event.type) { diff --git a/src/js/plugins/vimeo.js b/src/js/plugins/vimeo.js index 76a85424..c8c09b05 100644 --- a/src/js/plugins/vimeo.js +++ b/src/js/plugins/vimeo.js @@ -6,7 +6,7 @@ import captions from './../captions'; import controls from './../controls'; import ui from './../ui'; import { createElement, replaceElement, toggleClass } from './../utils/elements'; -import { trigger } from './../utils/events'; +import { triggerEvent } from './../utils/events'; import fetch from './../utils/fetch'; import is from './../utils/is'; import loadScript from './../utils/loadScript'; @@ -41,7 +41,7 @@ function assurePlaybackState(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -186,7 +186,7 @@ const vimeo = { // Set seeking state and trigger event media.seeking = true; - trigger.call(player, media, 'seeking'); + triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete Promise.resolve(restorePause && embed.setVolume(0)) @@ -213,7 +213,7 @@ const vimeo = { .setPlaybackRate(input) .then(() => { speed = input; - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }) .catch(error => { // Hide menu item (and menu if empty) @@ -233,7 +233,7 @@ const vimeo = { set(input) { player.embed.setVolume(input).then(() => { volume = input; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); }, }); @@ -249,7 +249,7 @@ const vimeo = { player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => { muted = toggle; - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }); }, }); @@ -316,13 +316,13 @@ const vimeo = { // Get current time player.embed.getCurrentTime().then(value => { currentTime = value; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); // Get duration player.embed.getDuration().then(value => { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); }); // Get captions @@ -341,7 +341,7 @@ const vimeo = { player.embed.getPaused().then(paused => { assurePlaybackState.call(player, !paused); if (!paused) { - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); } }); @@ -356,7 +356,7 @@ const vimeo = { player.embed.on('play', () => { assurePlaybackState.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); }); player.embed.on('pause', () => { @@ -366,16 +366,16 @@ const vimeo = { player.embed.on('timeupdate', data => { player.media.seeking = false; currentTime = data.seconds; - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }); player.embed.on('progress', data => { player.media.buffered = data.percent; - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); // Check all loaded if (parseInt(data.percent, 10) === 1) { - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } // Get duration as if we do it before load, it gives an incorrect value @@ -383,24 +383,24 @@ const vimeo = { player.embed.getDuration().then(value => { if (value !== player.media.duration) { player.media.duration = value; - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } }); }); player.embed.on('seeked', () => { player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); }); player.embed.on('ended', () => { player.media.paused = true; - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); }); player.embed.on('error', detail => { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }); // Rebuild UI diff --git a/src/js/plugins/youtube.js b/src/js/plugins/youtube.js index e486aa43..8a16726e 100644 --- a/src/js/plugins/youtube.js +++ b/src/js/plugins/youtube.js @@ -6,7 +6,7 @@ import controls from './../controls'; import ui from './../ui'; import { dedupe } from './../utils/arrays'; import { createElement, replaceElement, toggleClass } from './../utils/elements'; -import { trigger } from './../utils/events'; +import { triggerEvent } from './../utils/events'; import fetch from './../utils/fetch'; import is from './../utils/is'; import loadImage from './../utils/loadImage'; @@ -25,52 +25,25 @@ function parseId(url) { // Standardise YouTube quality unit function mapQualityUnit(input) { - switch (input) { - case 'hd2160': - return 2160; - - case 2160: - return 'hd2160'; - - case 'hd1440': - return 1440; - - case 1440: - return 'hd1440'; - - case 'hd1080': - return 1080; - - case 1080: - return 'hd1080'; - - case 'hd720': - return 720; - - case 720: - return 'hd720'; - - case 'large': - return 480; - - case 480: - return 'large'; - - case 'medium': - return 360; - - case 360: - return 'medium'; - - case 'small': - return 240; - - case 240: - return 'small'; - - default: - return 'default'; + const qualities = { + hd2160: 2160, + hd1440: 1440, + hd1080: 1080, + hd720: 720, + large: 480, + medium: 360, + small: 240, + tiny: 144, + }; + + const entry = Object.entries(qualities).find(entry => entry.includes(input)); + + if (entry) { + // Get the match corresponding to the input + return entry.find(value => value !== input); } + + return 'default'; } function mapQualityUnits(levels) { @@ -88,7 +61,7 @@ function assurePlaybackState(play) { } if (this.media.paused === play) { this.media.paused = !play; - trigger.call(this, this.media, play ? 'play' : 'pause'); + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); } } @@ -266,10 +239,10 @@ const youtube = { player.media.error = detail; - trigger.call(player, player.media, 'error'); + triggerEvent.call(player, player.media, 'error'); }, onPlaybackQualityChange() { - trigger.call(player, player.media, 'qualitychange', false, { + triggerEvent.call(player, player.media, 'qualitychange', false, { quality: player.media.quality, }); }, @@ -280,7 +253,7 @@ const youtube = { // Get current speed player.media.playbackRate = instance.getPlaybackRate(); - trigger.call(player, player.media, 'ratechange'); + triggerEvent.call(player, player.media, 'ratechange'); }, onReady(event) { // Get the instance @@ -321,7 +294,7 @@ const youtube = { // Set seeking state and trigger event player.media.seeking = true; - trigger.call(player, player.media, 'seeking'); + triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent instance.seekTo(time); @@ -344,15 +317,7 @@ const youtube = { return mapQualityUnit(instance.getPlaybackQuality()); }, set(input) { - const quality = input; - - // Set via API - instance.setPlaybackQuality(mapQualityUnit(quality)); - - // Trigger request event - trigger.call(player, player.media, 'qualityrequested', false, { - quality, - }); + instance.setPlaybackQuality(mapQualityUnit(input)); }, }); @@ -365,7 +330,7 @@ const youtube = { set(input) { volume = input; instance.setVolume(volume * 100); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }, }); @@ -379,7 +344,7 @@ const youtube = { const toggle = is.boolean(input) ? input : muted; muted = toggle; instance[toggle ? 'mute' : 'unMute'](); - trigger.call(player, player.media, 'volumechange'); + triggerEvent.call(player, player.media, 'volumechange'); }, }); @@ -405,8 +370,8 @@ const youtube = { player.media.setAttribute('tabindex', -1); } - trigger.call(player, player.media, 'timeupdate'); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'durationchange'); // Reset timer clearInterval(player.timers.buffering); @@ -418,7 +383,7 @@ const youtube = { // Trigger progress only when we actually buffer something if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) { - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); } // Set last buffer point @@ -429,7 +394,7 @@ const youtube = { clearInterval(player.timers.buffering); // Trigger event - trigger.call(player, player.media, 'canplaythrough'); + triggerEvent.call(player, player.media, 'canplaythrough'); } }, 200); @@ -451,7 +416,7 @@ const youtube = { if (seeked) { // Unset seeking and fire seeked event player.media.seeking = false; - trigger.call(player, player.media, 'seeked'); + triggerEvent.call(player, player.media, 'seeked'); } // Handle events @@ -464,11 +429,11 @@ const youtube = { switch (event.data) { case -1: // Update scrubber - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube player.media.buffered = instance.getVideoLoadedFraction(); - trigger.call(player, player.media, 'progress'); + triggerEvent.call(player, player.media, 'progress'); break; @@ -481,7 +446,7 @@ const youtube = { instance.stopVideo(); instance.playVideo(); } else { - trigger.call(player, player.media, 'ended'); + triggerEvent.call(player, player.media, 'ended'); } break; @@ -493,11 +458,11 @@ const youtube = { } else { assurePlaybackState.call(player, true); - trigger.call(player, player.media, 'playing'); + triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress player.timers.playing = setInterval(() => { - trigger.call(player, player.media, 'timeupdate'); + triggerEvent.call(player, player.media, 'timeupdate'); }, 50); // Check duration again due to YouTube bug @@ -505,7 +470,7 @@ const youtube = { // https://code.google.com/p/gdata-issues/issues/detail?id=8690 if (player.media.duration !== instance.getDuration()) { player.media.duration = instance.getDuration(); - trigger.call(player, player.media, 'durationchange'); + triggerEvent.call(player, player.media, 'durationchange'); } // Get quality @@ -527,7 +492,7 @@ const youtube = { break; } - trigger.call(player, player.elements.container, 'statechange', false, { + triggerEvent.call(player, player.elements.container, 'statechange', false, { code: event.data, }); }, diff --git a/src/js/plyr.js b/src/js/plyr.js index 1031efb2..71619851 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -20,9 +20,9 @@ import support from './support'; import ui from './ui'; import { closest } from './utils/arrays'; import { createElement, hasClass, removeElement, replaceElement, toggleClass, toggleState, wrap } from './utils/elements'; -import { off, on, trigger } from './utils/events'; +import { off, on, once, triggerEvent, unbindListeners } from './utils/events'; import is from './utils/is'; -import loadSprite from './utils/loadScript'; +import loadSprite from './utils/loadSprite'; import { cloneDeep, extend } from './utils/objects'; import { parseUrl } from './utils/urls'; @@ -171,7 +171,7 @@ class Plyr { this.elements.container.className = ''; // Get attributes from URL and set config - if (!url.searchParams) { + if (url.searchParams.length) { const truthy = [ '1', 'true', @@ -249,6 +249,8 @@ class Plyr { return; } + this.eventListeners = []; + // Create listeners this.listeners = new Listeners(this); @@ -275,7 +277,7 @@ class Plyr { // Listen for events if debugging if (this.config.debug) { - on(this.elements.container, this.config.events.join(' '), event => { + on.call(this, this.elements.container, this.config.events.join(' '), event => { this.debug.log(`event: ${event.type}`); }); } @@ -673,36 +675,31 @@ class Plyr { * @param {number} input - Quality level */ set quality(input) { - let quality = null; - - if (!is.empty(input)) { - quality = Number(input); - } - - if (!is.number(quality)) { - quality = this.storage.get('quality'); - } - - if (!is.number(quality)) { - quality = this.config.quality.selected; - } - - if (!is.number(quality)) { - quality = this.config.quality.default; - } + const config = this.config.quality; + const options = this.options.quality; - if (!this.options.quality.length) { + if (!options.length) { return; } - if (!this.options.quality.includes(quality)) { - const value = closest(this.options.quality, quality); + let quality = ([ + !is.empty(input) && Number(input), + this.storage.get('quality'), + config.selected, + config.default, + ]).find(is.number); + + if (!options.includes(quality)) { + const value = closest(options, quality); this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`); quality = value; } + // Trigger request event + triggerEvent.call(this, this.media, 'qualityrequested', false, { quality }); + // Update config - this.config.quality.selected = quality; + config.selected = quality; // Set quality this.media.quality = quality; @@ -853,7 +850,7 @@ class Plyr { // Update state and trigger event if (active !== this.captions.active) { this.captions.active = active; - trigger.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); + triggerEvent.call(this, this.media, this.captions.active ? 'captionsenabled' : 'captionsdisabled'); } } @@ -957,7 +954,7 @@ class Plyr { // Trigger event on change if (hiding !== isHidden) { const eventName = hiding ? 'controlshidden' : 'controlsshown'; - trigger.call(this, this.media, eventName); + triggerEvent.call(this, this.media, eventName); } return !hiding; } @@ -970,9 +967,16 @@ class Plyr { * @param {function} callback - Callback for when event occurs */ on(event, callback) { - on(this.elements.container, event, callback); + on.call(this, this.elements.container, event, callback); + } + /** + * Add event listeners once + * @param {string} event - Event type + * @param {function} callback - Callback for when event occurs + */ + once(event, callback) { + once(this.elements.container, event, callback); } - /** * Remove event listeners * @param {string} event - Event type @@ -1023,13 +1027,13 @@ class Plyr { } } else { // Unbind listeners - this.listeners.clear(); + unbindListeners.call(this); // Replace the container with the original element provided replaceElement(this.elements.original, this.elements.container); // Event - trigger.call(this, this.elements.original, 'destroyed', true); + triggerEvent.call(this, this.elements.original, 'destroyed', true); // Callback if (is.function(callback)) { diff --git a/src/js/ui.js b/src/js/ui.js index e3faf42f..d3d86124 100644 --- a/src/js/ui.js +++ b/src/js/ui.js @@ -8,7 +8,7 @@ import i18n from './i18n'; import support from './support'; import browser from './utils/browser'; import { getElement, toggleClass, toggleState } from './utils/elements'; -import { trigger } from './utils/events'; +import { triggerEvent } from './utils/events'; import is from './utils/is'; import loadImage from './utils/loadImage'; @@ -102,7 +102,7 @@ const ui = { // Ready event at end of execution stack setTimeout(() => { - trigger.call(this, this.media, 'ready'); + triggerEvent.call(this, this.media, 'ready'); }, 0); // Set the title diff --git a/src/js/utils/events.js b/src/js/utils/events.js index cb92a93c..a8e05f54 100644 --- a/src/js/utils/events.js +++ b/src/js/utils/events.js @@ -27,7 +27,7 @@ const supportsPassiveListeners = (() => { })(); // Toggle event listener -export function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) { +export function toggleListener(elements, event, callback, toggle = false, passive = true, capture = false, once = false) { // Bail if no elemetns, event, or callback if (is.empty(elements) || is.empty(event) || !is.function(callback)) { return; @@ -64,22 +64,37 @@ export function toggleListener(elements, event, callback, toggle = false, passiv // If a single node is passed, bind the event listener events.forEach(type => { + if (this && this.eventListeners && toggle && !once) { + // Cache event listener + this.eventListeners.push({ elements, type, callback, options }); + } + elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); }); } // Bind event handler export function on(element, events = '', callback, passive = true, capture = false) { - toggleListener(element, events, callback, true, passive, capture); + toggleListener.call(this, element, events, callback, true, passive, capture); } // Unbind event handler export function off(element, events = '', callback, passive = true, capture = false) { - toggleListener(element, events, callback, false, passive, capture); + toggleListener.call(this, element, events, callback, false, passive, capture); +} + +// Bind once-only event handler +export function once(element, events = '', callback, passive = true, capture = false) { + function onceCallback(...args) { + off(element, events, onceCallback, passive, capture); + callback.apply(this, args); + } + + toggleListener(element, events, onceCallback, true, passive, capture, true); } // Trigger event -export function trigger(element, type = '', bubbles = false, detail = {}) { +export function triggerEvent(element, type = '', bubbles = false, detail = {}) { // Bail if no element if (!is.element(element) || is.empty(type)) { return; @@ -96,3 +111,15 @@ export function trigger(element, type = '', bubbles = false, detail = {}) { // Dispatch the event element.dispatchEvent(event); } + +// Unbind all cached event listeners +export function unbindListeners() { + if (this && this.eventListeners) { + this.eventListeners.forEach(item => { + const { elements, type, callback, options } = item; + elements.removeEventListener(type, callback, options); + }); + + this.eventListeners = []; + } +} |