diff options
author | Sam Potts <sam@potts.es> | 2018-10-24 23:04:18 +1100 |
---|---|---|
committer | Sam Potts <sam@potts.es> | 2018-10-24 23:04:18 +1100 |
commit | e49da6c13f670b5bbe890c1e8108af2154f6c307 (patch) | |
tree | 5d80f9a8cf12f875c4119298e97444260cf55789 | |
parent | 779e45c11b72144d2762eb43689d7f5478450109 (diff) | |
download | plyr-e49da6c13f670b5bbe890c1e8108af2154f6c307.tar.lz plyr-e49da6c13f670b5bbe890c1e8108af2154f6c307.tar.xz plyr-e49da6c13f670b5bbe890c1e8108af2154f6c307.zip |
v3.4.5
-rw-r--r-- | changelog.md | 7 | ||||
-rw-r--r-- | controls.md | 1 | ||||
-rw-r--r-- | demo/dist/demo.css | 2 | ||||
-rw-r--r-- | dist/plyr.css | 2 | ||||
-rw-r--r-- | dist/plyr.js | 240 | ||||
-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 | 240 | ||||
-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-- | dist/plyr.svg | 2 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | readme.md | 9 | ||||
-rw-r--r-- | src/js/plyr.js | 2 | ||||
-rw-r--r-- | src/js/plyr.polyfilled.js | 2 |
17 files changed, 349 insertions, 172 deletions
diff --git a/changelog.md b/changelog.md index b12363c1..ef2bcf0a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,10 @@ +# v3.4.5 + +- Added download button option to download either current source or a custom URL you specify in options +- Prevent immediate hiding of controls on mobile (thanks @jamesoflol) +- Don't hide controls on focusout event (fixes #1122) (thanks @jamesoflol) +- Fix HTML5 quality settings being incorrectly set in local storage (thanks @TechGuard) + # v3.4.4 - Fixed issue with double binding for `click` and `touchstart` for `clickToPlay` option diff --git a/controls.md b/controls.md index 263e12f3..b7b08c58 100644 --- a/controls.md +++ b/controls.md @@ -28,6 +28,7 @@ controls: [ 'settings', // Settings menu 'pip', // Picture-in-picture (currently Safari only) 'airplay', // Airplay (currently Safari only) + 'download', // Show a download button with a link to either the current source or a custom URL you specify in your options 'fullscreen', // Toggle fullscreen ]; ``` diff --git a/demo/dist/demo.css b/demo/dist/demo.css index c9a26174..caf2fc34 100644 --- a/demo/dist/demo.css +++ b/demo/dist/demo.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1260px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 20px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:13px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px}
\ No newline at end of file +@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:300;src:url(https://cdn.plyr.io/static/fonts/gordita-light.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-light.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:400;src:url(https://cdn.plyr.io/static/fonts/gordita-regular.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-regular.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:500;src:url(https://cdn.plyr.io/static/fonts/gordita-medium.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-medium.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:600;src:url(https://cdn.plyr.io/static/fonts/gordita-bold.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-bold.woff) format("woff")}@font-face{font-display:swap;font-family:Gordita;font-style:normal;font-weight:900;src:url(https://cdn.plyr.io/static/fonts/gordita-black.woff2) format("woff2"),url(https://cdn.plyr.io/static/fonts/gordita-black.woff) format("woff")}@keyframes fadein{0%{opacity:0}100%{opacity:1}}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a,button.faux-link{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}*,::after,::before{box-sizing:border-box}body,html{display:flex;width:100%}html{background:linear-gradient(to left top,#4dc1ff,#0074b3);background-attachment:fixed;height:100%}body{align-items:center;display:flex;flex-direction:column;min-height:100%}.grid{flex:1;overflow:auto}main{margin:auto;padding-bottom:1px;text-align:center}aside{align-items:center;background:#fff;color:#55646b;display:flex;flex-shrink:0;justify-content:center;padding:15px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:10px}aside p{margin:0}aside a,aside button.faux-link{color:#4baaf4}aside a.tab-focus,aside button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(75,170,244,.35);outline:0}.grid{margin:0 auto;padding:20px}@media only screen and (min-width:768px){.grid{align-items:center;display:flex;max-width:1260px;width:100%}.grid>*{flex:1}}html{font-size:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:15px;font-size:.9375rem;color:#fff;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75;text-shadow:0 1px 1px rgba(0,0,0,.15)}button,input,select,textarea{font:inherit}p,small{margin:0 0 20px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 20px}.button,.button__count{align-items:center;background:#fff;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);color:#55646b;display:inline-flex;padding:15px;position:relative;text-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{color:#343f4a}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1);transform:translateY(-1px)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{transform:translateY(1px)}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;margin-left:10px}.button__count::before{border:5px solid transparent;border-left-width:0;border-right-color:#fff;content:'';height:0;position:absolute;right:100%;top:50%;transform:translateY(-50%);width:0}header{padding-bottom:20px;text-align:center}header .call-to-action{margin-top:30px}@media only screen and (min-width:768px){header{margin-right:60px;max-width:360px;padding-bottom:40px;text-align:left}}.icon{fill:currentColor;height:16px;vertical-align:-3px;width:16px}a svg,button svg,button.faux-link svg,label svg{pointer-events:none}.btn .icon,a .icon,button.faux-link .icon{margin-right:6px}button.faux-link{background:0 0;border:0;border-radius:0;cursor:pointer;font:inherit;line-height:1.75;margin:0;padding:0;position:relative;text-align:inherit;text-shadow:inherit;-moz-user-select:text;vertical-align:baseline;width:auto}a,button.faux-link{border-bottom:1px dotted currentColor;color:#fff;font-weight:600;position:relative;text-decoration:none;transition:all .2s ease}a::after,button.faux-link::after{background:currentColor;content:'';height:1px;left:50%;position:absolute;top:100%;transform:translateX(-50%);transition:width .2s ease;width:0}a:focus,a:hover,button.faux-link:focus,button.faux-link:hover{border-bottom-color:transparent;outline:0}a:focus::after,a:hover::after,button.faux-link:focus::after,button.faux-link:hover::after{width:100%}a.tab-focus,button.tab-focus.faux-link{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}a.no-border::after,button.no-border.faux-link::after{display:none}li,ul{list-style:none;margin:0;padding:0}audio,img,video{max-width:100%;vertical-align:middle}nav{display:flex;justify-content:center;margin-bottom:20px}video{max-width:100%;vertical-align:middle}.plyr{border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.2);margin:20px auto}.plyr.plyr--audio{max-width:480px}.plyr__video-wrapper::after{border:1px solid rgba(0,0,0,.15);border-radius:inherit;bottom:0;content:'';left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:3}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:4px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:inherit;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui button.faux-link,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:12px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}a.plyr__control,button.plyr__control.faux-link{text-decoration:none}a.plyr__control::after,a.plyr__control::before,button.plyr__control.faux-link::after,button.plyr__control.faux-link::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:13px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:13px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:11px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:12px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.no-border{border:0}[hidden]{display:none}.sr-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;opacity:.001;overflow:hidden;padding:0;position:absolute;width:1px}
\ No newline at end of file diff --git a/dist/plyr.css b/dist/plyr.css index 5310d692..c1bd4285 100644 --- a/dist/plyr.css +++ b/dist/plyr.css @@ -1 +1 @@ -@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
\ No newline at end of file +@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--video .plyr__control svg{filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls .plyr__progress+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:2px}.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0;margin-right:auto}.plyr__controls:empty{display:none}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls .plyr__volume,.plyr__controls>.plyr__control{margin-left:10px}}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#1aafff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(26,175,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__progress{flex:1;left:7px;margin-right:14px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-7px;margin-right:-7px;width:calc(100% + 14px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin-top:-3px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(183,197,205,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
\ No newline at end of file diff --git a/dist/plyr.js b/dist/plyr.js index 57702183..cdc5a20f 100644 --- a/dist/plyr.js +++ b/dist/plyr.js @@ -178,6 +178,11 @@ typeof navigator === "object" && (function (global, factory) { // Accept a URL object if (instanceOf(input, window.URL)) { return true; + } // Must be string from here + + + if (!isString(input)) { + return false; } // Add the protocol if required @@ -1006,6 +1011,13 @@ typeof navigator === "object" && (function (global, factory) { return wrapper.innerHTML; } + var resources = { + pip: 'PIP', + airplay: 'AirPlay', + html5: 'HTML5', + vimeo: 'Vimeo', + youtube: 'YouTube' + }; var i18n = { get: function get() { var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; @@ -1018,6 +1030,10 @@ typeof navigator === "object" && (function (global, factory) { var string = getDeep(config.i18n, key); if (is.empty(string)) { + if (Object.keys(resources).includes(key)) { + return resources[key]; + } + return ''; } @@ -1330,23 +1346,18 @@ typeof navigator === "object" && (function (global, factory) { if ('href' in use) { use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); - } else { - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); - } // Add <use> to <svg> + } // Always set the older attribute even though it's "deprecated" (it'll be around for ages) + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg> + icon.appendChild(use); return icon; }, // Create hidden text label - createLabel: function createLabel(type) { + createLabel: function createLabel(key) { var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Skip i18n for abbreviations and brand names - var universals = { - pip: 'PIP', - airplay: 'AirPlay' - }; - var text = universals[type] || i18n.get(type, this.config); + var text = i18n.get(key, this.config); var attributes = Object.assign({}, attr, { class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') }); @@ -1368,20 +1379,29 @@ typeof navigator === "object" && (function (global, factory) { }, // Create a <button> createButton: function createButton(buttonType, attr) { - var button = createElement('button'); var attributes = Object.assign({}, attr); var type = toCamelCase(buttonType); - var toggle = false; - var label; - var icon; - var labelPressed; - var iconPressed; + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission - if (!('type' in attributes)) { + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { attributes.type = 'button'; - } + } // Set class name - if ('class' in attributes) { + + if (Object.keys(attributes).includes('class')) { if (!attributes.class.includes(this.config.classNames.control)) { attributes.class += " ".concat(this.config.classNames.control); } @@ -1392,69 +1412,76 @@ typeof navigator === "object" && (function (global, factory) { switch (buttonType) { case 'play': - toggle = true; - label = 'play'; - labelPressed = 'pause'; - icon = 'play'; - iconPressed = 'pause'; + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; break; case 'mute': - toggle = true; - label = 'mute'; - labelPressed = 'unmute'; - icon = 'volume'; - iconPressed = 'muted'; + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; break; case 'captions': - toggle = true; - label = 'enableCaptions'; - labelPressed = 'disableCaptions'; - icon = 'captions-off'; - iconPressed = 'captions-on'; + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; break; case 'fullscreen': - toggle = true; - label = 'enterFullscreen'; - labelPressed = 'exitFullscreen'; - icon = 'enter-fullscreen'; - iconPressed = 'exit-fullscreen'; + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; break; case 'play-large': attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); type = 'play'; - label = 'play'; - icon = 'play'; + props.label = 'play'; + props.icon = 'play'; break; default: - label = type; - icon = buttonType; - } // Setup toggle icon and labels + if (is.empty(props.label)) { + props.label = type; + } + + if (is.empty(props.icon)) { + props.icon = buttonType; + } + } - if (toggle) { + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { // Icon - button.appendChild(controls.createIcon.call(this, iconPressed, { + button.appendChild(controls.createIcon.call(this, props.iconPressed, { class: 'icon--pressed' })); - button.appendChild(controls.createIcon.call(this, icon, { + button.appendChild(controls.createIcon.call(this, props.icon, { class: 'icon--not-pressed' })); // Label/Tooltip - button.appendChild(controls.createLabel.call(this, labelPressed, { + button.appendChild(controls.createLabel.call(this, props.labelPressed, { class: 'label--pressed' })); - button.appendChild(controls.createLabel.call(this, label, { + button.appendChild(controls.createLabel.call(this, props.label, { class: 'label--not-pressed' })); } else { - button.appendChild(controls.createIcon.call(this, icon)); - button.appendChild(controls.createLabel.call(this, label)); - } // Merge attributes + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); @@ -2307,6 +2334,17 @@ typeof navigator === "object" && (function (global, factory) { controls.focusFirstMenuItem.call(this, target, tabFocus); }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, // Build the default HTML // TODO: Set order based on order in the config.controls array? create: function create(data) { @@ -2512,6 +2550,25 @@ typeof navigator === "object" && (function (global, factory) { if (this.config.controls.includes('airplay') && support.airplay) { container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); } // Toggle fullscreen button @@ -3178,7 +3235,8 @@ typeof navigator === "object" && (function (global, factory) { controls: ['play-large', // 'restart', // 'rewind', 'play', // 'fast-forward', - 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'], + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], settings: ['captions', 'quality', 'speed'], // Localisation i18n: { @@ -3198,6 +3256,7 @@ typeof navigator === "object" && (function (global, factory) { unmute: 'Unmute', enableCaptions: 'Enable captions', disableCaptions: 'Disable captions', + download: 'Download', enterFullscreen: 'Enter fullscreen', exitFullscreen: 'Exit fullscreen', frameTitle: 'Player for {title}', @@ -3226,6 +3285,7 @@ typeof navigator === "object" && (function (global, factory) { }, // URLs urls: { + download: null, vimeo: { sdk: 'https://player.vimeo.com/api/player.js', iframe: 'https://player.vimeo.com/video/{0}?{1}', @@ -3250,6 +3310,7 @@ typeof navigator === "object" && (function (global, factory) { mute: null, volume: null, captions: null, + download: null, fullscreen: null, pip: null, airplay: null, @@ -3262,7 +3323,7 @@ typeof navigator === "object" && (function (global, factory) { events: [// Events to watch on HTML5 media elements and bubble // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events - 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube 'statechange', // Quality 'qualitychange', // Ads 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], @@ -3284,6 +3345,7 @@ typeof navigator === "object" && (function (global, factory) { fastForward: '[data-plyr="fast-forward"]', mute: '[data-plyr="mute"]', captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', fullscreen: '[data-plyr="fullscreen"]', pip: '[data-plyr="pip"]', airplay: '[data-plyr="airplay"]', @@ -3396,7 +3458,7 @@ typeof navigator === "object" && (function (global, factory) { }; /** * Get provider by URL - * @param {string} url + * @param {String} url */ function getProviderByUrl(url) { @@ -3923,8 +3985,10 @@ typeof navigator === "object" && (function (global, factory) { var controls$$1 = this.elements.controls; if (controls$$1 && this.config.hideControls) { - // Show controls if force, loading, paused, or button interaction, otherwise hide - this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover)); + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); } } }; @@ -4283,7 +4347,7 @@ typeof navigator === "object" && (function (global, factory) { if (!is.element(wrapper)) { return; - } // On click play, pause ore restart + } // On click play, pause or restart on.call(player, elements.container, 'click', function (event) { @@ -4336,6 +4400,10 @@ typeof navigator === "object" && (function (global, factory) { on.call(player, player.media, 'qualitychange', function (event) { // Update UI controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); }); // Proxy events to container // Bubble up key events for Edge @@ -4413,7 +4481,11 @@ typeof navigator === "object" && (function (global, factory) { this.bind(elements.buttons.captions, 'click', function () { return player.toggleCaptions(); - }); // Fullscreen toggle + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle this.bind(elements.buttons.fullscreen, 'click', function () { player.fullscreen.toggle(); @@ -4476,8 +4548,10 @@ typeof navigator === "object" && (function (global, factory) { if (is.keyboardEvent(event) && code !== 39 && code !== 37) { return; - } // Was playing before? + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + player.lastSeekTime = Date.now(); // Was playing before? var play = seek.hasAttribute(attribute); // Done seeking @@ -4555,32 +4629,28 @@ typeof navigator === "object" && (function (global, factory) { this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); - }); // Focus in/out on controls + }); // Show controls when they receive focus (e.g., when using keyboard tab key) - this.bind(elements.controls, 'focusin focusout', function (event) { + this.bind(elements.controls, 'focusin', function () { var config = player.config, elements = player.elements, - timers = player.timers; - var isFocusIn = event.type === 'focusin'; // Skip transition to prevent focus from scrolling the parent element + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element - toggleClass(elements.controls, config.classNames.noTransition, isFocusIn); // Toggle + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle - ui.toggleControls.call(player, isFocusIn); // If focusin, hide again after delay + ui.toggleControls.call(player, true); // Restore transition - if (isFocusIn) { - // Restore transition - setTimeout(function () { - toggleClass(elements.controls, config.classNames.noTransition, false); - }, 0); // Delay a little more for keyboard users + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users - var delay = _this2.touch ? 3000 : 4000; // Clear timer + var delay = _this2.touch ? 3000 : 4000; // Clear timer - clearTimeout(timers.controls); // Hide + clearTimeout(timers.controls); // Hide again after delay - timers.controls = setTimeout(function () { - return ui.toggleControls.call(player, false); - }, delay); - } + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); }); // Mouse wheel for volume this.bind(elements.inputs.volume, 'wheel', function (event) { @@ -5171,6 +5241,7 @@ typeof navigator === "object" && (function (global, factory) { var currentSrc; player.embed.getVideoUrl().then(function (value) { currentSrc = value; + controls.setDownloadLink.call(player); }).catch(function (error) { _this2.debug.warn(error); }); @@ -6724,7 +6795,10 @@ typeof navigator === "object" && (function (global, factory) { if (this.config.autoplay) { this.play(); - } + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; } // --------------------------------------- // API // --------------------------------------- @@ -7449,6 +7523,16 @@ typeof navigator === "object" && (function (global, factory) { return this.media.currentSrc; } /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is.url(download) ? download : this.source; + } + /** * Set the poster image for a video * @param {input} - the URL for the new poster image */ diff --git a/dist/plyr.js.map b/dist/plyr.js.map index 9f8bb001..9dc8343e 100644 --- a/dist/plyr.js.map +++ b/dist/plyr.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isArray","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","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","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","create","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","define","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","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);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './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(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\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:\n '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\n // Quality\n 'qualitychange',\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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\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\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && 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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.4\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isArray","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","vimeo","youtube","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","control","button","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","setDownloadLink","download","create","inner","home","backButton","href","urls","isEmbed","inject","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","define","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","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);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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 attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\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 props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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 // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n '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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\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 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\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 download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // 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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && 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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = (100 / x) * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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 controls.setDownloadLink.call(player);\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.5\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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 6fb3c5e8..c3fea9ca 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";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(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)}}function n(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,a=!1,s=void 0;try{for(var o,r=e[Symbol.iterator]();!(i=(o=r.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){a=!0,s=e}finally{try{i||null==r.return||r.return()}finally{if(a)throw s}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var o=function(e){return null!=e?e.constructor:null},r=function(e,t){return Boolean(e&&t&&e instanceof t)},l=function(e){return null==e},c=function(e){return o(e)===Object},u=function(e){return o(e)===String},d=function(e){return Array.isArray(e)},h=function(e){return r(e,NodeList)},p=function(e){return l(e)||(u(e)||d(e)||h(e))&&!e.length||c(e)&&!Object.keys(e).length},f={nullOrUndefined:l,object:c,number:function(e){return o(e)===Number&&!Number.isNaN(e)},string:u,boolean:function(e){return o(e)===Boolean},function:function(e){return o(e)===Function},array:d,weakMap:function(e){return r(e,WeakMap)},nodeList:h,element:function(e){return r(e,Element)},textNode:function(e){return o(e)===Text},event:function(e){return r(e,Event)},keyboardEvent:function(e){return r(e,KeyboardEvent)},cue:function(e){return r(e,window.TextTrackCue)||r(e,window.VTTCue)},track:function(e){return r(e,TextTrack)||!l(e)&&u(e.kind)},url:function(e){if(r(e,window.URL))return!0;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!p(new URL(t).hostname)}catch(e){return!1}},empty:p},m=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 g(e,t,n){var i=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!f.empty(t)&&f.function(n)){var r=t.split(" "),l=o;m&&(l={passive:s,capture:o}),r.forEach(function(t){i&&i.eventListeners&&a&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[a?"addEventListener":"removeEventListener"](t,n,l)})}}function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!0,i,a)}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!1,i,a)}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,function s(){v(e,t,s,i,a);for(var o=arguments.length,r=new Array(o),l=0;l<o;l++)r[l]=arguments[l];n.apply(this,r)},!0,i,a)}function k(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(f.element(e)&&!f.empty(t)){var a=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(a)}}function w(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;i.appendChild(e),s?a.insertBefore(i,s):a.appendChild(i)})}function T(e,t){f.element(e)&&!f.empty(t)&&Object.entries(t).filter(function(e){var t=a(e,2)[1];return!f.nullOrUndefined(t)}).forEach(function(t){var n=a(t,2),i=n[0],s=n[1];return e.setAttribute(i,s)})}function A(e,t,n){var i=document.createElement(e);return f.object(t)&&T(i,t),f.string(n)&&(i.innerText=n),i}function E(e,t,n,i){f.element(t)&&t.appendChild(A(e,n,i))}function C(e){f.nodeList(e)||f.array(e)?Array.from(e).forEach(C):f.element(e)&&f.element(e.parentNode)&&e.parentNode.removeChild(e)}function P(e){if(f.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function S(e,t){return f.element(t)&&f.element(t.parentNode)&&f.element(e)?(t.parentNode.replaceChild(e,t),e):null}function M(e,t){if(!f.string(e)||f.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),a=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),o=s[0],r=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":f.object(i)&&f.string(i.class)&&(i.class+=" ".concat(a)),n.class=a;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=r}}),n}function N(e,t){if(f.element(e)){var n=t;f.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function L(e,t,n){if(f.nodeList(e))return Array.from(e).map(function(e){return L(e,t,n)});if(f.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function x(e,t){return f.element(e)&&e.classList.contains(t)}function I(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 _(e){return this.elements.container.querySelectorAll(e)}function j(e){return this.elements.container.querySelector(e)}function O(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f.element(e)&&(e.focus(),t&&L(e,this.config.classNames.tabFocus))}var q,R,B,V=(q=document.createElement("span"),R={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},B=Object.keys(R).find(function(e){return void 0!==q.style[e]}),!!f.string(B)&&R[B]);function H(e){setTimeout(function(){try{N(e,!0),e.offsetHeight,N(e,!1)}catch(e){}},0)}var D,F={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)},U={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},z={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=F.isIPhone&&n&&z.playsinline,a=z[e]||"html5"!==t;return{api:a,ui:a&&z.rangeInput&&("video"!==e||!F.isIPhone||i)}},pip:!F.isIPhone&&f.function(A("video").webkitSetPresentationMode),airplay:f.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=a(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in U&&(t="".concat(e,'; codecs="').concat(U[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(D=document.createElement("input"),D.type="range","range"===D.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==V,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},W={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return z.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return W.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=W.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=W.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,a=i.currentTime,s=i.paused,o=i.preload,r=i.readyState;e.media.src=n.getAttribute("src"),("none"!==o||r)&&(e.once("loadedmetadata",function(){e.currentTime=a,s||e.play()}),e.media.load()),k.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(C(W.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function K(e){return f.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function Y(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function J(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new 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 f.object(s)?(Object.keys(s).forEach(function(t){f.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,i({},t,{})),J(e[t],s[t])):Object.assign(e,i({},t,s[t]))}),J.apply(void 0,[e].concat(n))):e}function Q(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return f.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function $(){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 G(){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 X(){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=$(e,"-"," "),e=$(e,"_"," "),$(e=G(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Z(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var ee=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(f.empty(e)||f.empty(t))return"";var n=Y(t.i18n,e);if(f.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=a(e,2),i=t[0],s=t[1];n=$(n,i,s)}),n},te=function(){function t(n){e(this,t),this.enabled=n.config.storage.enabled,this.key=n.config.storage.key}return n(t,[{key:"get",value:function(e){if(!t.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(f.empty(n))return null;var i=JSON.parse(n);return f.string(e)&&e.length?i[e]:i}},{key:"set",value:function(e){if(t.supported&&this.enabled&&f.object(e)){var n=this.get();f.empty(n)&&(n={}),J(n,e),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}}}]),t}();function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(a.responseText))}catch(e){n(a.responseText)}else n(a.response)}),a.addEventListener("error",function(){throw new Error(a.status)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){i(e)}})}function ie(e,t){if(f.string(e)){var n=f.string(t),i=function(){return null!==document.getElementById(t)},a=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var s=te.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),s){var r=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==r){var l=JSON.parse(r);a(o,l.content)}}ne(e).then(function(e){f.empty(e)||(s&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),a(o,e))}).catch(function(){})}}}var ae=function(e){return parseInt(e/60/60%60,10)},se=function(e){return parseInt(e/60%60,10)},oe=function(e){return parseInt(e%60,10)};function re(){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(!f.number(e))return re(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},a=ae(e),s=se(e),o=oe(e);return a=t||a>0?"".concat(a,":"):"","".concat(n&&e>0?"-":"").concat(a).concat(i(s),":").concat(i(o))}var le={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||F.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=j.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:_.call(this,this.config.selectors.buttons.play),pause:j.call(this,this.config.selectors.buttons.pause),restart:j.call(this,this.config.selectors.buttons.restart),rewind:j.call(this,this.config.selectors.buttons.rewind),fastForward:j.call(this,this.config.selectors.buttons.fastForward),mute:j.call(this,this.config.selectors.buttons.mute),pip:j.call(this,this.config.selectors.buttons.pip),airplay:j.call(this,this.config.selectors.buttons.airplay),settings:j.call(this,this.config.selectors.buttons.settings),captions:j.call(this,this.config.selectors.buttons.captions),fullscreen:j.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=j.call(this,this.config.selectors.progress),this.elements.inputs={seek:j.call(this,this.config.selectors.inputs.seek),volume:j.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:j.call(this,this.config.selectors.display.buffer),currentTime:j.call(this,this.config.selectors.display.currentTime),duration:j.call(this,this.config.selectors.display.duration)},f.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(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=le.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),a=document.createElementNS("http://www.w3.org/2000/svg","svg");T(a,J(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),o="".concat(i,"-").concat(e);return"href"in s?s.setAttributeNS("http://www.w3.org/1999/xlink","href",o):s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(s),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||ee(e,this.config);return A("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(f.empty(e))return null;var t=A("span",{class:this.config.classNames.menu.value});return t.appendChild(A("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n,i,a,s,o=A("button"),r=Object.assign({},t),l=X(e),c=!1;switch("type"in r||(r.type="button"),"class"in r?r.class.includes(this.config.classNames.control)||(r.class+=" ".concat(this.config.classNames.control)):r.class=this.config.classNames.control,e){case"play":c=!0,n="play",a="pause",i="play",s="pause";break;case"mute":c=!0,n="mute",a="unmute",i="volume",s="muted";break;case"captions":c=!0,n="enableCaptions",a="disableCaptions",i="captions-off",s="captions-on";break;case"fullscreen":c=!0,n="enterFullscreen",a="exitFullscreen",i="enter-fullscreen",s="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),l="play",n="play",i="play";break;default:n=l,i=e}return c?(o.appendChild(le.createIcon.call(this,s,{class:"icon--pressed"})),o.appendChild(le.createIcon.call(this,i,{class:"icon--not-pressed"})),o.appendChild(le.createLabel.call(this,a,{class:"label--pressed"})),o.appendChild(le.createLabel.call(this,n,{class:"label--not-pressed"}))):(o.appendChild(le.createIcon.call(this,i)),o.appendChild(le.createLabel.call(this,n))),J(r,M(this.config.selectors.buttons[l],r)),T(o,r),"play"===l?(f.array(this.elements.buttons[l])||(this.elements.buttons[l]=[]),this.elements.buttons[l].push(o)):this.elements.buttons[l]=o,o},createRange:function(e,t){var n=A("input",J(M(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":ee(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,le.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=A("progress",J(M(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(A("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],a=i?ee(i,this.config):"";n.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=M(this.config.selectors.display[e]),n=A("div",J(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":ee(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;y(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var a,s=I(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(i.which))le.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||s&&39===i.which?(a=e.nextElementSibling,f.element(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,f.element(a)||(a=e.parentNode.lastElementChild)),O.call(n,a,!0))}},!1),y(e,"keyup",function(e){13===e.which&&le.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,a=e.type,s=e.title,o=e.badge,r=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=M(this.config.selectors.inputs[a]),d=A("button",J(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=A("span");h.innerHTML=s,f.element(r)&&h.appendChild(r),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return I(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!f.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,a){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}le.showMenuPanel.call(t,"home",f.keyboardEvent(e))}},a,!1),le.bindMenuItemShortcuts.call(this,d,a),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return f.number(e)?re(e,ae(this.duration)>0,t):e},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];f.element(e)&&f.number(t)&&(e.innerText=le.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(f.element(this.elements.inputs.volume)&&le.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),f.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;f.element(e)&&(e.value=t,le.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&f.event(e)){var n,i,a=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,a=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&le.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,n){var i=f.number(n)?n:0,a=f.element(e)?e:t.elements.display.buffer;if(f.element(a)){a.value=i;var s=a.getElementsByTagName("span")[0];f.element(s)&&(s.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=f.event(e)?e.target:e;if(f.element(t)&&"range"===t.getAttribute("type")){if(I(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=le.formatTime(this.currentTime),i=le.formatTime(this.duration),a=ee("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",n).replace("{duration}",i))}else if(I(t,this.config.selectors.inputs.volume)){var s=100*t.value;t.setAttribute("aria-valuenow",s),t.setAttribute("aria-valuetext","".concat(s.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);F.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&f.element(this.elements.inputs.seek)&&f.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),a="".concat(this.config.classNames.tooltip,"--visible"),s=function(e){L(t.elements.display.seekTooltip,a,e)};if(this.touch)s(!1);else{if(f.event(e))n=100/i.width*(e.pageX-i.left);else{if(!x(this.elements.display.seekTooltip,a))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),le.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),f.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!f.element(this.elements.display.duration)&&this.config.invertTime;le.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||le.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return N(this.elements.display.currentTime,!0),void N(this.elements.progress,!0);f.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=f.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&le.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&le.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),le.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){N(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],a=null,s=t;if("captions"===e)a=this.currentTrack;else{if(a=f.empty(n)?this[e]:n,f.empty(a)&&(a=this.config[e].default),!f.empty(this.options[e])&&!this.options[e].includes(a))return void this.debug.warn("Unsupported value of '".concat(a,"' for ").concat(e));if(!this.config[e].options.includes(a))return void this.debug.warn("Disabled value of '".concat(a,"' for ").concat(e))}if(f.element(s)||(s=i&&i.querySelector('[role="menu"]')),f.element(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=le.getLabel.call(this,e,a);var o=s&&s.querySelector('[value="'.concat(a,'"]'));f.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?ee("normal",this.config):"".concat(t,"×");case"quality":if(f.number(t)){var n=ee("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return G(t);case"captions":return de.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(f.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');f.array(e)&&(this.options.quality=K(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!f.empty(this.options.quality)&&this.options.quality.length>1;if(le.toggleMenuButton.call(this,"quality",i),P(n),le.checkMenu.call(this),i){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){le.createMenuItem.call(t,{value:e,list:n,type:"quality",title:le.getLabel.call(t,"quality",e),badge:function(e){var n=ee("qualityBadge.".concat(e),t.config);return n.length?le.createBadge.call(t,n):null}(e)})}),le.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(f.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=de.getTracks.call(this),i=Boolean(n.length);if(le.toggleMenuButton.call(this,"captions",i),P(t),le.checkMenu.call(this),i){var a=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:de.getLabel.call(e,n),badge:n.language&&le.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});a.unshift({value:-1,checked:!this.captions.toggled,title:ee("disabled",this.config),list:t,type:"language"}),a.forEach(le.createMenuItem.bind(this)),le.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(f.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');f.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 i=!f.empty(this.options.speed)&&this.options.speed.length>1;le.toggleMenuButton.call(this,"speed",i),P(n),le.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){le.createMenuItem.call(t,{value:e,list:n,type:"speed",title:le.getLabel.call(t,"speed",e)})}),le.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!f.empty(e)&&Object.values(e).some(function(e){return!e.hidden});N(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;f.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');O.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(f.element(t)&&f.element(n)){var i=t.hidden,a=i;if(f.boolean(e))a=e;else if(f.keyboardEvent(e)&&27===e.which)a=!1;else if(f.event(e)){var s=t.contains(e.target);if(s||!s&&e.target!==n&&a)return}n.setAttribute("aria-expanded",a),N(t,!a),L(this.elements.container,this.config.classNames.menu.open,a),a&&f.keyboardEvent(e)?le.focusFirstMenuItem.call(this,null,!0):a||i||O.call(this,n,f.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return C(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(f.element(i)){var a=i.parentNode,s=Array.from(a.children).find(function(e){return!e.hidden});if(z.transitions&&!z.reducedMotion){a.style.width="".concat(s.scrollWidth,"px"),a.style.height="".concat(s.scrollHeight,"px");var o=le.getMenuSize.call(this,i);y.call(this,a,V,function t(n){n.target===a&&["width","height"].includes(n.propertyName)&&(a.style.width="",a.style.height="",v.call(e,a,V,t))}),a.style.width="".concat(o.width,"px"),a.style.height="".concat(o.height,"px")}N(s,!0),N(i,!1),le.focusFirstMenuItem.call(this,i,n)}},create:function(e){var t=this,n=A("div",M(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(le.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(le.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(le.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(le.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=A("div",M(this.config.selectors.progress));if(i.appendChild(le.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(le.createProgress.call(this,"buffer")),this.config.tooltips.seek){var a=A("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(le.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(le.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var s=A("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&s.appendChild(le.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};s.appendChild(le.createRange.call(this,"volume",J(o,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=s}n.appendChild(s)}if(this.config.controls.includes("captions")&&n.appendChild(le.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!f.empty(this.config.settings)){var r=A("div",{class:"plyr__menu",hidden:""});r.appendChild(le.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=A("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=A("div"),u=A("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=A("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=A("button",J(M(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));le.bindMenuItemShortcuts.call(t,i,n),y(i,"click",function(){le.showMenuPanel.call(t,n,!1)});var a=A("span",null,ee(n,t.config)),s=A("span",{class:t.config.classNames.menu.value});s.innerHTML=e[n],a.appendChild(s),i.appendChild(a),d.appendChild(i);var o=A("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),r=A("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});r.appendChild(A("span",{"aria-hidden":!0},ee(n,t.config))),r.appendChild(A("span",{class:t.config.classNames.hidden},ee("menuBack",t.config))),y(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),le.showMenuPanel.call(t,"home",!0))},!1),y(r,"click",function(){le.showMenuPanel.call(t,"home",!1)}),o.appendChild(r),o.appendChild(A("div",{role:"menu"})),c.appendChild(o),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=o}),l.appendChild(c),r.appendChild(l),n.appendChild(r),this.elements.settings.popup=l,this.elements.settings.menu=r}return this.config.controls.includes("pip")&&z.pip&&n.appendChild(le.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&z.airplay&&n.appendChild(le.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(le.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(le.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&le.setQualityMenu.call(this,W.getQualityOptions.call(this)),le.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=le.getIconUrl.call(this);t.cors&&ie(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},s=!0;f.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),f.element(this.config.controls)||f.string(this.config.controls)?n=this.config.controls:(n=le.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:de.getLabel.call(this)}),s=!1);var o,r=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t=$(t,"{".concat(i,"}"),s)}),t};if(s&&(f.string(this.config.controls)?n=r(n):f.element(n)&&(n.innerHTML=r(n.innerHTML))),f.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),f.element(o)||(o=this.elements.container),o[f.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),f.element(this.elements.controls)||le.findElements.call(this),!f.empty(this.elements.buttons)){var l=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return x(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];L(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){f.array(e)||f.nodeList(e)?Array.from(e).filter(Boolean).forEach(l):l(e)})}if(window.navigator.userAgent.includes("Edge")&&H(o),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h="".concat(d.controls.wrapper," ").concat(d.labels," .").concat(u.hidden),p=_.call(this,h);Array.from(p).forEach(function(t){L(t,e.config.classNames.hidden,!1),L(t,e.config.classNames.tooltip,!0)})}}};function ce(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 ue(e){var t=new URLSearchParams;return f.object(e)&&Object.entries(e).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t.set(i,s)}),t}var de={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!z.textTracks)f.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&le.setCaptionsMenu.call(this);else{var e,t;if(f.element(this.elements.captions)||(this.elements.captions=A("div",M(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,f.element(e)&&f.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),F.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=ce(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&ne(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){C(e)})})}var i=K((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===s)s=a(i,1)[0];var o=this.storage.get("captions");if(f.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:s,languages:i}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";y.call(this,this.media.textTracks,r,de.update.bind(this))}setTimeout(de.update.bind(this),0)}},update:function(){var e=this,t=de.getTracks.call(this,!0),n=this.captions,i=n.active,a=n.language,s=n.meta,o=n.currentTrackNode,r=Boolean(t.find(function(e){return e.language===a}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!s.get(e)}).forEach(function(t){e.debug.log("Track added",t),s.set(t,{default:"showing"===t.mode}),t.mode="hidden",y.call(e,t,"cuechange",function(){return de.updateCues.call(e)})}),(r&&this.language!==a||!t.includes(o))&&(de.setLanguage.call(this,a),de.toggle.call(this,i&&r)),L(this.elements.container,this.config.classNames.captions.enabled,!f.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&le.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,a=f.nullOrUndefined(e)?!n:e;if(a!==n){if(t||(this.captions.active=a,this.storage.set({captions:a})),!this.language&&a&&!t){var o=de.getTracks.call(this),r=de.findTrack.call(this,[this.captions.language].concat(s(this.captions.languages)),!0);return this.captions.language=r.language,void de.set.call(this,o.indexOf(r))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=a),L(this.elements.container,i,a),this.captions.toggled=a,le.updateSetting.call(this,"captions"),k.call(this,this.media,a?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=de.getTracks.call(this);if(-1!==e)if(f.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],a=(i||{}).language;this.captions.currentTrackNode=i,le.updateSetting.call(this,"captions"),t||(this.captions.language=a,this.storage.set({language:a})),this.isVimeo&&this.embed.enableTextTrack(a),k.call(this,this.media,"languagechange")}de.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&de.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else de.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(f.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=de.getTracks.call(this),a=de.findTrack.call(this,[n]);de.set.call(this,i.indexOf(a),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)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=de.getTracks.call(this),s=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(a).sort(function(e,t){return s(t)-s(e)});return e.every(function(e){return!(t=o.find(function(t){return t.language===e}))}),t||(i?o[0]:void 0)},getCurrentTrack:function(){return de.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!f.track(t)&&z.textTracks&&this.captions.toggled&&(t=de.getCurrentTrack.call(this)),f.track(t)?f.empty(t.label)?f.empty(t.language)?ee("enabled",this.config):e.language.toUpperCase():t.label:ee("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(f.element(this.elements.captions))if(f.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=de.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Z)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){P(this.elements.captions);var a=A("span",M(this.config.selectors.caption));a.innerHTML=i,this.elements.captions.appendChild(a),k.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},he={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!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]},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",seekLabel:"{currentTime} of {duration}",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",menuBack:"Go back to previous menu",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","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",controlPressed:"plyr__control--pressed",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",display:{time:"plyr__time"},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:""}},pe={html5:"html5",youtube:"youtube",vimeo:"vimeo"},fe={audio:"audio",video:"video"};var me=function(){},ge=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e(this,t),this.enabled=window.console&&n,this.enabled&&this.log("Debugging enabled")}return n(t,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):me}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):me}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):me}}]),t}();function ye(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;f.element(e)&&(e.pressed=this.active),k.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),F.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(f.element(e)){var n=_.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],a=n[n.length-1];g.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==a||e.shiftKey?t===i&&e.shiftKey&&(a.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function ve(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",L(this.target,this.player.config.classNames.fullscreen.fallback,t),F.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var a=f.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!a,a||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return H(e.target)},100)}ye.call(this)}var be=function(){function t(n){var i=this;e(this,t),this.player=n,this.prefix=t.prefix,this.property=t.property,this.scrollPosition={x:0,y:0},y.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){ye.call(i)}),y.call(this.player,this.player.elements.container,"dblclick",function(e){f.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return n(t,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(t.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),L(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(F.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():t.native?this.prefix?f.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():ve.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(F.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(t.native)if(this.prefix){if(!f.empty(this.prefix)){var e="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(e).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else ve.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(t.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&&(t.native?(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:x(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return F.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(f.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!f.function(document["".concat(t,"ExitFullscreen")])&&!f.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),t}();function ke(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?n:i)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var we={addStyleHook:function(){L(this.elements.container,this.config.selectors.container.replace(".",""),!0),L(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 ".concat(this.provider," ").concat(this.type)),void we.toggleNativeControls.call(this,!0);f.element(this.elements.controls)||(le.inject.call(this),this.listeners.controls()),we.toggleNativeControls.call(this),this.isHTML5&&de.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,le.updateVolume.call(this),le.timeUpdate.call(this),we.checkPlaying.call(this),L(this.elements.container,this.config.classNames.pip.supported,z.pip&&this.isHTML5&&this.isVideo),L(this.elements.container,this.config.classNames.airplay.supported,z.airplay&&this.isHTML5),L(this.elements.container,this.config.classNames.isIos,F.isIos),L(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){k.call(e,e.media,"ready")},0),we.setTitle.call(this),this.poster&&we.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&le.durationUpdate.call(this)},setTitle:function(){var e=ee("play",this.config);if(f.string(this.config.title)&&!f.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=j.call(this,"iframe");if(!f.element(t))return;var n=f.empty(this.config.title)?"video":this.config.title,i=ee("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){L(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):y.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return ke(e)}).catch(function(n){throw e===t.poster&&we.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),we.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;L(this.elements.container,this.config.classNames.playing,this.playing),L(this.elements.container,this.config.classNames.paused,this.paused),L(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),f.event(e)&&"timeupdate"===e.type||we.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(){L(t.elements.container,t.config.classNames.loading,t.loading),we.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))}},Te=function(){function t(n){e(this,t),this.player=n,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return n(t,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&f.number(i)){if(a){var o=document.activeElement;if(f.element(o)){var r=t.config.selectors.editable;if(o!==n.inputs.seek&&I(o,r))return;if(32===e.which&&I(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:s||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:s||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:s||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){le.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,L(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,a=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||a)i=t.config.classNames.tabFocus,L(_.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&L(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&g.call(t,window,"keydown keyup",this.handleKey,e,!1),g.call(t,document.body,"click",this.toggleMenu,e),b.call(t,document.body,"touchstart",this.firstTouch),g.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&y.call(e,t.container,"keydown keyup",this.handleKey,!1),y.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(we.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return we.toggleControls.call(e,!1)},a)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(y.call(e,e.media,"timeupdate seeking seeked",function(t){return le.timeUpdate.call(e,t)}),y.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return le.durationUpdate.call(e,t)}),y.call(e,e.media,"canplay",function(){N(t.volume,!e.hasAudio),N(t.buttons.mute,!e.hasAudio)}),y.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),y.call(e,e.media,"progress playing seeking seeked",function(t){return le.updateProgress.call(e,t)}),y.call(e,e.media,"volumechange",function(t){return le.updateVolume.call(e,t)}),y.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return we.checkPlaying.call(e,t)}),y.call(e,e.media,"waiting canplay seeked playing",function(t){return we.checkLoading.call(e,t)}),y.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=j.call(e,".".concat(e.config.classNames.video));if(!f.element(n))return;y.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&y.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),y.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),y.call(e,e.media,"ratechange",function(){le.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),y.call(e,e.media,"qualitychange",function(t){le.updateSetting.call(e,"quality",null,t.detail.quality)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");y.call(e,e.media,i,function(n){var i=n.detail,a=void 0===i?{}:i;"error"===n.type&&(a=e.media.error),k.call(e,t.container,n.type,!0,a)})}},{key:"proxy",value:function(e,t,n){var i=this.player,a=i.config.listeners[n],s=!0;f.function(a)&&(s=a.call(i,e)),s&&f.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var a=this,s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,r=o.config.listeners[i],l=f.function(r);y.call(o,e,t,function(e){return a.proxy(e,n,i)},s&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=F.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),le.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),le.toggleMenu.call(t,e)):le.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&le.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!f.keyboardEvent(e)||39===i||37===i){var a=n.hasAttribute("play-on-seeked"),s=["mouseup","touchend","keyup"].includes(e.type);a&&s?(n.removeAttribute("play-on-seeked"),t.play()):!s&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),F.isIos){var s=_.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,i,function(e){return H(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");f.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return le.updateSeekTooltip.call(t,e)}),F.isWebkit&&Array.from(_.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return le.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!f.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,le.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin focusout",function(n){var i=t.config,a=t.elements,s=t.timers,o="focusin"===n.type;if(L(a.controls,i.classNames.noTransition,o),we.toggleControls.call(t,o),o){setTimeout(function(){L(a.controls,i.classNames.noTransition,!1)},0);var r=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(function(){return we.toggleControls.call(t,!1)},r)}}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=a([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),s=i[0],o=i[1],r=Math.sign(Math.abs(s)>Math.abs(o)?s:o);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()},"volume",!1)}}]),t}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ae,Ee=(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function a(e,t){if(e){var a=i[e];if(n[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,a){var s,r,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(r=l.createElement("link")).rel="stylesheet",r.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(r=l.createElement("img")).src=h:((r=l.createElement("script")).src=t,r.async=void 0===c||c),r.onload=r.onerror=r.onbeforeload=function(e){var l=e.type[0];if(s&&"hideFocus"in r)try{r.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(a+=1)<u)return o(t,n,i,a);n(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function r(e,n,i){var r,l;if(n&&n.trim&&(r=n),l=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}!function(e,t,n){var i,a,s=(e=e.push?e:[e]).length,r=s,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--s||t(l)},a=0;a<r;a++)o(e[a],i,n)}(e,function(e){s(l,e),a(r,e)},l)}return r.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,o,r=[],l=e.length,c=l;for(a=function(e,n){n.length&&r.push(e),--c||t(r)};l--;)s=e[l],(o=n[s])?a(s,o):(i[s]=i[s]||[]).push(a)}(e,function(e){s(t,e)}),r},r.done=function(e){a(e,[])},r.reset=function(){t={},n={},i={}},r.isDefined=function(e){return e in t},r},e.exports=n()}(Ae={exports:{}},Ae.exports),Ae.exports);function Ce(e){return new Promise(function(t,n){Ee(e,{success:t,error:n})})}function Pe(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Se={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),Se.setAspectRatio.call(this),f.object(window.Vimeo)?Se.ready.call(this):Ce(this.config.urls.vimeo.sdk).then(function(){Se.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=a((f.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=ue({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");f.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var a,s=(a=i,f.empty(a)?null:f.number(Number(a))?a:a.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:a),o=A("iframe"),r=Q(t.config.urls.vimeo.iframe,s,n);o.setAttribute("src",r),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var l=A("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(o),t.media=S(l,t.media),ne(Q(t.config.urls.vimeo.api,s),"json").then(function(e){if(!f.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),we.setPoster.call(t,n.href).catch(function(){})}}),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 Pe.call(t,!0),t.embed.play()},t.media.pause=function(){return Pe.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,a=t.paused,s=t.volume,o=a&&!n.hasPlayed;i.seeking=!0,k.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(s)}).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,k.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&le.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,k.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!f.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,k.call(t,t.media,"volumechange")})}});var p,m=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return m},set:function(e){var n=f.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){m=n})}}),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"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Se.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,we.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,k.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,k.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,de.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});de.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){Pe.call(t,!e),e||k.call(t,t.media,"playing")}),f.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){Pe.call(t,!0),k.call(t,t.media,"playing")}),t.embed.on("pause",function(){Pe.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,k.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,k.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&k.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,k.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,k.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,k.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,k.call(t,t.media,"error")}),setTimeout(function(){return we.build.call(t)},0)}};function Me(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Ne,Le={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),Le.setAspectRatio.call(this),f.object(window.YT)&&f.function(window.YT.Player)?Le.ready.call(this):(Ce(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(){Le.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(f.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(f.empty(n))return this.config.title=n,void we.setTitle.call(this)}var i=this.config.keys.google;f.string(i)&&!f.empty(i)&&ne(Q(this.config.urls.youtube.api,e,i)).then(function(e){f.object(e)&&(t.config.title=e.items[0].snippet.title,we.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(f.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");f.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,a,s=(i=n,f.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=(a=e.provider,"".concat(a,"-").concat(Math.floor(1e4*Math.random()))),r=A("div",{id:o,poster:e.poster});e.media=S(r,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(s,"/").concat(e,"default.jpg")};ke(l("maxres"),121).catch(function(){return ke(l("sd"),121)}).catch(function(){return ke(l("hq"))}).then(function(t){return we.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(o,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,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(!e.media.error){var n=t.data,i={2:"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.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},k.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),k.call(e,e.media,"ratechange")},onReady:function(t){if(!f.function(e.media.play)){var n=t.target;Le.getTitle.call(e,s),e.media.play=function(){Me.call(e,!0),n.playVideo()},e.media.pause=function(){Me.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.hasPlayed&&e.embed.mute(),e.media.seeking=!0,k.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),k.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var i=f.boolean(t)?t:a;a=i,n[i?"mute":"unMute"](),k.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),k.call(e,e.media,"timeupdate"),k.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)&&k.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),k.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return we.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,k.call(e,e.media,"seeked")),t.data){case-1:k.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),k.call(e,e.media,"progress");break;case 0:Me.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):k.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Me.call(e,!0),k.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){k.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),k.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Me.call(e,!1)}k.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},xe={setup:function(){this.media?(L(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),L(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&L(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=A("div",{class:this.config.classNames.video}),w(this.media,this.elements.wrapper),this.elements.poster=A("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?W.extend.call(this):this.isYouTube?Le.setup.call(this):this.isVimeo&&Se.setup.call(this)):this.debug.warn("No media element found!")}},Ie=function(){function t(n){var i=this;e(this,t),this.player=n,this.publisherId=n.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 n(t,[{key:"load",value:function(){var e=this;this.enabled&&(f.object(window.google)&&f.object(window.google.ima)?this.ready():Ce(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=A("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=re(Math.max(e.manager.getRemainingTime(),0)),n="".concat(ee("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),f.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(f.element(n)){var i=100/t.player.duration*e,a=A("span",{class:t.player.config.classNames.cues});a.style.left="".concat(i.toString(),"%"),n.appendChild(a)}}}),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(),a=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());k.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.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,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;f.empty(t.cuePoints)||t.cuePoints.forEach(function(i,a){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.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=new Array(n>1?n-1:0),a=1;a<n;a++)i[a-1]=arguments[a];var s=this.events[e];f.array(s)&&s.forEach(function(e){f.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return f.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: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){f.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!f.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(ue(e))}}]),t}(),_e={insertElements:function(e,t){var n=this;f.string(t)?E(e,this.media,{src:t}):f.array(t)&&t.forEach(function(t){E(e,n.media,t)})},change:function(e){var t=this;Y(e,"sources.length")?(W.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],C(t.media),t.media=null,f.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,s=a(n,1)[0],o=s.provider,r=void 0===o?pe.html5:o,l=s.src,c="html5"===r?i:"div",u="html5"===r?{}:{src:l};Object.assign(t,{provider:r,type:i,supported:z.check(i,r,t.config.playsinline),media:A(c,u)}),t.elements.container.appendChild(t.media),f.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),f.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","")),we.addStyleHook.call(t),t.isHTML5&&_e.insertElements.call(t,"source",n),t.config.title=e.title,xe.setup.call(t),t.isHTML5&&("tracks"in e&&_e.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&we.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},je=function(){function t(n,i){var a=this;if(e(this,t),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=z.touch,this.media=n,f.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||f.nodeList(this.media)||f.array(this.media))&&(this.media=this.media[0]),this.config=J({},he,t.defaults,i||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ge(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",z),!f.nullOrUndefined(this.media)&&f.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(z.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var o=this.media.tagName.toLowerCase(),r=null,l=null;switch(o){case"div":if(r=this.media.querySelector("iframe"),f.element(r)){if(l=ce(r.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?pe.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?pe.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",l.search.length){var c=["1","true"];c.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(l.searchParams.get("playsinline")),this.config.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(f.empty(this.provider)||!Object.keys(pe).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=fe.video;break;case"video":case"audio":this.type=o,this.provider=pe.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-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=z.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Te(this),this.storage=new te(this),this.media.plyr=this,f.element(this.elements.container)||(this.elements.container=A("div"),w(this.media,this.elements.container)),we.addStyleHook.call(this),xe.setup.call(this),this.config.debug&&y.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&we.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new be(this),this.config.ads.enabled&&(this.ads=new Ie(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 n(t,[{key:"play",value:function(){return f.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&f.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(f.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):f.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(f.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(f.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(f.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){de.toggle.call(this,e,!1)}},{key:"airplay",value:function(){z.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=x(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=L(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!f.empty(this.config.settings)&&le.toggleMenu.call(this,!1),i!==t){var a=i?"controlshidden":"controlsshown";k.call(this,this.media,a)}return!i}return!1}},{key:"on",value:function(e,t){y.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){b.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){v(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&&(C(t.elements.buttons.play),C(t.elements.captions),C(t.elements.controls),C(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),f.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,a=e.options;t.removeEventListener(n,i,a)}),this.eventListeners=[])}.call(t),S(t.elements.original,t.elements.container),k.call(t,t.elements.original,"destroyed",!0),f.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),we.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&f.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return z.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===pe.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===pe.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===pe.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===fe.video)}},{key:"isAudio",get:function(){return Boolean(this.type===fe.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=f.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return f.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,n=f.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;f.string(t)&&(t=Number(t)),f.number(t)||(t=this.storage.get("volume")),f.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!f.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;f.boolean(t)||(t=this.storage.get("muted")),f.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;f.number(e)&&(t=e),f.number(t)||(t=this.storage.get("speed")),f.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 (".concat(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=[!f.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(f.number);if(!n.includes(i)){var a=function(e,t){return f.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: ".concat(i,", using ").concat(a," instead")),i=a}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=f.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){_e.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?we.setPoster.call(this,e,!1).catch(function(){}):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=f.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){de.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){de.setLanguage.call(this,e,!1)},get:function(){return(de.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(z.pip){var i=f.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return z.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return z.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return ie(e,t)}},{key:"setup",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return f.string(e)?i=Array.from(document.querySelectorAll(e)):f.nodeList(e)?i=Array.from(e):f.array(e)&&(i=e.filter(f.element)),f.empty(i)?null:i.map(function(e){return new t(e,n)})}}]),t}();return je.defaults=(Ne=he,JSON.parse(JSON.stringify(Ne))),je}); +"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";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(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)}}function n(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,a=!1,s=void 0;try{for(var o,r=e[Symbol.iterator]();!(i=(o=r.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){a=!0,s=e}finally{try{i||null==r.return||r.return()}finally{if(a)throw s}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var o=function(e){return null!=e?e.constructor:null},r=function(e,t){return Boolean(e&&t&&e instanceof t)},l=function(e){return null==e},c=function(e){return o(e)===Object},u=function(e){return o(e)===String},d=function(e){return Array.isArray(e)},h=function(e){return r(e,NodeList)},p=function(e){return l(e)||(u(e)||d(e)||h(e))&&!e.length||c(e)&&!Object.keys(e).length},m={nullOrUndefined:l,object:c,number:function(e){return o(e)===Number&&!Number.isNaN(e)},string:u,boolean:function(e){return o(e)===Boolean},function:function(e){return o(e)===Function},array:d,weakMap:function(e){return r(e,WeakMap)},nodeList:h,element:function(e){return r(e,Element)},textNode:function(e){return o(e)===Text},event:function(e){return r(e,Event)},keyboardEvent:function(e){return r(e,KeyboardEvent)},cue:function(e){return r(e,window.TextTrackCue)||r(e,window.VTTCue)},track:function(e){return r(e,TextTrack)||!l(e)&&u(e.kind)},url:function(e){if(r(e,window.URL))return!0;if(!u(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!p(new URL(t).hostname)}catch(e){return!1}},empty:p},f=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 g(e,t,n){var i=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!m.empty(t)&&m.function(n)){var r=t.split(" "),l=o;f&&(l={passive:s,capture:o}),r.forEach(function(t){i&&i.eventListeners&&a&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[a?"addEventListener":"removeEventListener"](t,n,l)})}}function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!0,i,a)}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,n,!1,i,a)}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];g.call(this,e,t,function s(){v(e,t,s,i,a);for(var o=arguments.length,r=new Array(o),l=0;l<o;l++)r[l]=arguments[l];n.apply(this,r)},!0,i,a)}function k(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(m.element(e)&&!m.empty(t)){var a=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(a)}}function w(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var i=n>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;i.appendChild(e),s?a.insertBefore(i,s):a.appendChild(i)})}function T(e,t){m.element(e)&&!m.empty(t)&&Object.entries(t).filter(function(e){var t=a(e,2)[1];return!m.nullOrUndefined(t)}).forEach(function(t){var n=a(t,2),i=n[0],s=n[1];return e.setAttribute(i,s)})}function A(e,t,n){var i=document.createElement(e);return m.object(t)&&T(i,t),m.string(n)&&(i.innerText=n),i}function E(e,t,n,i){m.element(t)&&t.appendChild(A(e,n,i))}function C(e){m.nodeList(e)||m.array(e)?Array.from(e).forEach(C):m.element(e)&&m.element(e.parentNode)&&e.parentNode.removeChild(e)}function P(e){if(m.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function S(e,t){return m.element(t)&&m.element(t.parentNode)&&m.element(e)?(t.parentNode.replaceChild(e,t),e):null}function M(e,t){if(!m.string(e)||m.empty(e))return{};var n={},i=t;return e.split(",").forEach(function(e){var t=e.trim(),a=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),o=s[0],r=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":m.object(i)&&m.string(i.class)&&(i.class+=" ".concat(a)),n.class=a;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=r}}),n}function N(e,t){if(m.element(e)){var n=t;m.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function L(e,t,n){if(m.nodeList(e))return Array.from(e).map(function(e){return L(e,t,n)});if(m.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function x(e,t){return m.element(e)&&e.classList.contains(t)}function I(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 _(e){return this.elements.container.querySelectorAll(e)}function j(e){return this.elements.container.querySelector(e)}function O(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];m.element(e)&&(e.focus(),t&&L(e,this.config.classNames.tabFocus))}var q,R,B,D=(q=document.createElement("span"),R={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},B=Object.keys(R).find(function(e){return void 0!==q.style[e]}),!!m.string(B)&&R[B]);function V(e){setTimeout(function(){try{N(e,!0),e.offsetHeight,N(e,!1)}catch(e){}},0)}var H,F={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)},U={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},z={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=F.isIPhone&&n&&z.playsinline,a=z[e]||"html5"!==t;return{api:a,ui:a&&z.rangeInput&&("video"!==e||!F.isIPhone||i)}},pip:!F.isIPhone&&m.function(A("video").webkitSetPresentationMode),airplay:m.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=a(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in U&&(t="".concat(e,'; codecs="').concat(U[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(H=document.createElement("input"),H.type="range","range"===H.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==D,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},W={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return z.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return W.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=W.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=W.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,a=i.currentTime,s=i.paused,o=i.preload,r=i.readyState;e.media.src=n.getAttribute("src"),("none"!==o||r)&&(e.once("loadedmetadata",function(){e.currentTime=a,s||e.play()}),e.media.load()),k.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(C(W.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function K(e){return m.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function Y(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function J(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new 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 m.object(s)?(Object.keys(s).forEach(function(t){m.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,i({},t,{})),J(e[t],s[t])):Object.assign(e,i({},t,s[t]))}),J.apply(void 0,[e].concat(n))):e}function Q(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return m.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function $(){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 G(){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 X(){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=$(e,"-"," "),e=$(e,"_"," "),$(e=G(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function Z(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var ee={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},te=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(m.empty(e)||m.empty(t))return"";var n=Y(t.i18n,e);if(m.empty(n))return Object.keys(ee).includes(e)?ee[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=a(e,2),i=t[0],s=t[1];n=$(n,i,s)}),n},ne=function(){function t(n){e(this,t),this.enabled=n.config.storage.enabled,this.key=n.config.storage.key}return n(t,[{key:"get",value:function(e){if(!t.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(m.empty(n))return null;var i=JSON.parse(n);return m.string(e)&&e.length?i[e]:i}},{key:"set",value:function(e){if(t.supported&&this.enabled&&m.object(e)){var n=this.get();m.empty(n)&&(n={}),J(n,e),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}}}]),t}();function ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise(function(n,i){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",function(){if("text"===t)try{n(JSON.parse(a.responseText))}catch(e){n(a.responseText)}else n(a.response)}),a.addEventListener("error",function(){throw new Error(a.status)}),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){i(e)}})}function ae(e,t){if(m.string(e)){var n=m.string(t),i=function(){return null!==document.getElementById(t)},a=function(e,t){e.innerHTML=t,n&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!i()){var s=ne.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),s){var r=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==r){var l=JSON.parse(r);a(o,l.content)}}ie(e).then(function(e){m.empty(e)||(s&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),a(o,e))}).catch(function(){})}}}var se=function(e){return parseInt(e/60/60%60,10)},oe=function(e){return parseInt(e/60%60,10)},re=function(e){return parseInt(e%60,10)};function le(){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(!m.number(e))return le(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},a=se(e),s=oe(e),o=re(e);return a=t||a>0?"".concat(a,":"):"","".concat(n&&e>0?"-":"").concat(a).concat(i(s),":").concat(i(o))}var ce={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||F.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=j.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:_.call(this,this.config.selectors.buttons.play),pause:j.call(this,this.config.selectors.buttons.pause),restart:j.call(this,this.config.selectors.buttons.restart),rewind:j.call(this,this.config.selectors.buttons.rewind),fastForward:j.call(this,this.config.selectors.buttons.fastForward),mute:j.call(this,this.config.selectors.buttons.mute),pip:j.call(this,this.config.selectors.buttons.pip),airplay:j.call(this,this.config.selectors.buttons.airplay),settings:j.call(this,this.config.selectors.buttons.settings),captions:j.call(this,this.config.selectors.buttons.captions),fullscreen:j.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=j.call(this,this.config.selectors.progress),this.elements.inputs={seek:j.call(this,this.config.selectors.inputs.seek),volume:j.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:j.call(this,this.config.selectors.display.buffer),currentTime:j.call(this,this.config.selectors.display.currentTime),duration:j.call(this,this.config.selectors.display.duration)},m.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(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=ce.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),a=document.createElementNS("http://www.w3.org/2000/svg","svg");T(a,J(t,{role:"presentation",focusable:"false"}));var s=document.createElementNS("http://www.w3.org/2000/svg","use"),o="".concat(i,"-").concat(e);return"href"in s&&s.setAttributeNS("http://www.w3.org/1999/xlink","href",o),s.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(s),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=te(e,this.config);return A("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(m.empty(e))return null;var t=A("span",{class:this.config.classNames.menu.value});return t.appendChild(A("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Object.assign({},t),i=X(e),a={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(n).includes(e)&&(a[e]=n[e],delete n[e])}),"button"!==a.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.includes(this.config.classNames.control)||(n.class+=" ".concat(this.config.classNames.control)):n.class=this.config.classNames.control,e){case"play":a.toggle=!0,a.label="play",a.labelPressed="pause",a.icon="play",a.iconPressed="pause";break;case"mute":a.toggle=!0,a.label="mute",a.labelPressed="unmute",a.icon="volume",a.iconPressed="muted";break;case"captions":a.toggle=!0,a.label="enableCaptions",a.labelPressed="disableCaptions",a.icon="captions-off",a.iconPressed="captions-on";break;case"fullscreen":a.toggle=!0,a.label="enterFullscreen",a.labelPressed="exitFullscreen",a.icon="enter-fullscreen",a.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",a.label="play",a.icon="play";break;default:m.empty(a.label)&&(a.label=i),m.empty(a.icon)&&(a.icon=e)}var s=A(a.element);return a.toggle?(s.appendChild(ce.createIcon.call(this,a.iconPressed,{class:"icon--pressed"})),s.appendChild(ce.createIcon.call(this,a.icon,{class:"icon--not-pressed"})),s.appendChild(ce.createLabel.call(this,a.labelPressed,{class:"label--pressed"})),s.appendChild(ce.createLabel.call(this,a.label,{class:"label--not-pressed"}))):(s.appendChild(ce.createIcon.call(this,a.icon)),s.appendChild(ce.createLabel.call(this,a.label))),J(n,M(this.config.selectors.buttons[i],n)),T(s,n),"play"===i?(m.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(s)):this.elements.buttons[i]=s,s},createRange:function(e,t){var n=A("input",J(M(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":te(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,ce.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=A("progress",J(M(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(A("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],a=i?te(i,this.config):"";n.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=M(this.config.selectors.display[e]),n=A("div",J(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":te(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;y(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var a,s=I(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(i.which))ce.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||s&&39===i.which?(a=e.nextElementSibling,m.element(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,m.element(a)||(a=e.parentNode.lastElementChild)),O.call(n,a,!0))}},!1),y(e,"keyup",function(e){13===e.which&&ce.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,a=e.type,s=e.title,o=e.badge,r=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=M(this.config.selectors.inputs[a]),d=A("button",J(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=A("span");h.innerHTML=s,m.element(r)&&h.appendChild(r),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return I(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!m.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,a){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}ce.showMenuPanel.call(t,"home",m.keyboardEvent(e))}},a,!1),ce.bindMenuItemShortcuts.call(this,d,a),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return m.number(e)?le(e,se(this.duration)>0,t):e},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];m.element(e)&&m.number(t)&&(e.innerText=ce.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(m.element(this.elements.inputs.volume)&&ce.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),m.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;m.element(e)&&(e.value=t,ce.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&m.event(e)){var n,i,a=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=this.currentTime,i=this.duration,a=0===n||0===i||Number.isNaN(n)||Number.isNaN(i)?0:(n/i*100).toFixed(2),"timeupdate"===e.type&&ce.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,n){var i=m.number(n)?n:0,a=m.element(e)?e:t.elements.display.buffer;if(m.element(a)){a.value=i;var s=a.getElementsByTagName("span")[0];m.element(s)&&(s.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=m.event(e)?e.target:e;if(m.element(t)&&"range"===t.getAttribute("type")){if(I(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=ce.formatTime(this.currentTime),i=ce.formatTime(this.duration),a=te("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",n).replace("{duration}",i))}else if(I(t,this.config.selectors.inputs.volume)){var s=100*t.value;t.setAttribute("aria-valuenow",s),t.setAttribute("aria-valuetext","".concat(s.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);F.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&m.element(this.elements.inputs.seek)&&m.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),a="".concat(this.config.classNames.tooltip,"--visible"),s=function(e){L(t.elements.display.seekTooltip,a,e)};if(this.touch)s(!1);else{if(m.event(e))n=100/i.width*(e.pageX-i.left);else{if(!x(this.elements.display.seekTooltip,a))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),ce.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),m.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!m.element(this.elements.display.duration)&&this.config.invertTime;ce.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||ce.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return N(this.elements.display.currentTime,!0),void N(this.elements.progress,!0);m.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=m.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&ce.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&ce.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),ce.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){N(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],a=null,s=t;if("captions"===e)a=this.currentTrack;else{if(a=m.empty(n)?this[e]:n,m.empty(a)&&(a=this.config[e].default),!m.empty(this.options[e])&&!this.options[e].includes(a))return void this.debug.warn("Unsupported value of '".concat(a,"' for ").concat(e));if(!this.config[e].options.includes(a))return void this.debug.warn("Disabled value of '".concat(a,"' for ").concat(e))}if(m.element(s)||(s=i&&i.querySelector('[role="menu"]')),m.element(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=ce.getLabel.call(this,e,a);var o=s&&s.querySelector('[value="'.concat(a,'"]'));m.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?te("normal",this.config):"".concat(t,"×");case"quality":if(m.number(t)){var n=te("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return G(t);case"captions":return he.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(m.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');m.array(e)&&(this.options.quality=K(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!m.empty(this.options.quality)&&this.options.quality.length>1;if(ce.toggleMenuButton.call(this,"quality",i),P(n),ce.checkMenu.call(this),i){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){ce.createMenuItem.call(t,{value:e,list:n,type:"quality",title:ce.getLabel.call(t,"quality",e),badge:function(e){var n=te("qualityBadge.".concat(e),t.config);return n.length?ce.createBadge.call(t,n):null}(e)})}),ce.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(m.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=he.getTracks.call(this),i=Boolean(n.length);if(ce.toggleMenuButton.call(this,"captions",i),P(t),ce.checkMenu.call(this),i){var a=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:he.getLabel.call(e,n),badge:n.language&&ce.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});a.unshift({value:-1,checked:!this.captions.toggled,title:te("disabled",this.config),list:t,type:"language"}),a.forEach(ce.createMenuItem.bind(this)),ce.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(m.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');m.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 i=!m.empty(this.options.speed)&&this.options.speed.length>1;ce.toggleMenuButton.call(this,"speed",i),P(n),ce.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){ce.createMenuItem.call(t,{value:e,list:n,type:"speed",title:ce.getLabel.call(t,"speed",e)})}),ce.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!m.empty(e)&&Object.values(e).some(function(e){return!e.hidden});N(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;m.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');O.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(m.element(t)&&m.element(n)){var i=t.hidden,a=i;if(m.boolean(e))a=e;else if(m.keyboardEvent(e)&&27===e.which)a=!1;else if(m.event(e)){var s=t.contains(e.target);if(s||!s&&e.target!==n&&a)return}n.setAttribute("aria-expanded",a),N(t,!a),L(this.elements.container,this.config.classNames.menu.open,a),a&&m.keyboardEvent(e)?ce.focusFirstMenuItem.call(this,null,!0):a||i||O.call(this,n,m.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return C(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(m.element(i)){var a=i.parentNode,s=Array.from(a.children).find(function(e){return!e.hidden});if(z.transitions&&!z.reducedMotion){a.style.width="".concat(s.scrollWidth,"px"),a.style.height="".concat(s.scrollHeight,"px");var o=ce.getMenuSize.call(this,i);y.call(this,a,D,function t(n){n.target===a&&["width","height"].includes(n.propertyName)&&(a.style.width="",a.style.height="",v.call(e,a,D,t))}),a.style.width="".concat(o.width,"px"),a.style.height="".concat(o.height,"px")}N(s,!0),N(i,!1),ce.focusFirstMenuItem.call(this,i,n)}},setDownloadLink:function(){var e=this.elements.buttons.download;m.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=A("div",M(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(ce.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(ce.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(ce.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(ce.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=A("div",M(this.config.selectors.progress));if(i.appendChild(ce.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(ce.createProgress.call(this,"buffer")),this.config.tooltips.seek){var a=A("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(ce.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(ce.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var s=A("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&s.appendChild(ce.createButton.call(this,"mute")),this.config.controls.includes("volume")){var o={max:1,step:.05,value:this.config.volume};s.appendChild(ce.createRange.call(this,"volume",J(o,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=s}n.appendChild(s)}if(this.config.controls.includes("captions")&&n.appendChild(ce.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!m.empty(this.config.settings)){var r=A("div",{class:"plyr__menu",hidden:""});r.appendChild(ce.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=A("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=A("div"),u=A("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=A("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=A("button",J(M(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));ce.bindMenuItemShortcuts.call(t,i,n),y(i,"click",function(){ce.showMenuPanel.call(t,n,!1)});var a=A("span",null,te(n,t.config)),s=A("span",{class:t.config.classNames.menu.value});s.innerHTML=e[n],a.appendChild(s),i.appendChild(a),d.appendChild(i);var o=A("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),r=A("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});r.appendChild(A("span",{"aria-hidden":!0},te(n,t.config))),r.appendChild(A("span",{class:t.config.classNames.hidden},te("menuBack",t.config))),y(o,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),ce.showMenuPanel.call(t,"home",!0))},!1),y(r,"click",function(){ce.showMenuPanel.call(t,"home",!1)}),o.appendChild(r),o.appendChild(A("div",{role:"menu"})),c.appendChild(o),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=o}),l.appendChild(c),r.appendChild(l),n.appendChild(r),this.elements.settings.popup=l,this.elements.settings.menu=r}if(this.config.controls.includes("pip")&&z.pip&&n.appendChild(ce.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&z.airplay&&n.appendChild(ce.createButton.call(this,"airplay")),this.config.controls.includes("download")){var h={element:"a",href:this.download,target:"_blank"},p=this.config.urls.download;!m.url(p)&&this.isEmbed&&J(h,{icon:"logo-".concat(this.provider),label:this.provider}),n.appendChild(ce.createButton.call(this,"download",h))}return this.config.controls.includes("fullscreen")&&n.appendChild(ce.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(ce.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&ce.setQualityMenu.call(this,W.getQualityOptions.call(this)),ce.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=ce.getIconUrl.call(this);t.cors&&ae(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},s=!0;m.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),m.element(this.config.controls)||m.string(this.config.controls)?n=this.config.controls:(n=ce.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:he.getLabel.call(this)}),s=!1);var o,r=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t=$(t,"{".concat(i,"}"),s)}),t};if(s&&(m.string(this.config.controls)?n=r(n):m.element(n)&&(n.innerHTML=r(n.innerHTML))),m.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),m.element(o)||(o=this.elements.container),o[m.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),m.element(this.elements.controls)||ce.findElements.call(this),!m.empty(this.elements.buttons)){var l=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return x(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];L(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){m.array(e)||m.nodeList(e)?Array.from(e).filter(Boolean).forEach(l):l(e)})}if(window.navigator.userAgent.includes("Edge")&&V(o),this.config.tooltips.controls){var c=this.config,u=c.classNames,d=c.selectors,h="".concat(d.controls.wrapper," ").concat(d.labels," .").concat(u.hidden),p=_.call(this,h);Array.from(p).forEach(function(t){L(t,e.config.classNames.hidden,!1),L(t,e.config.classNames.tooltip,!0)})}}};function ue(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 de(e){var t=new URLSearchParams;return m.object(e)&&Object.entries(e).forEach(function(e){var n=a(e,2),i=n[0],s=n[1];t.set(i,s)}),t}var he={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!z.textTracks)m.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&ce.setCaptionsMenu.call(this);else{var e,t;if(m.element(this.elements.captions)||(this.elements.captions=A("div",M(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,m.element(e)&&m.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),F.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=ue(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&ie(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){C(e)})})}var i=K((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===s)s=a(i,1)[0];var o=this.storage.get("captions");if(m.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:s,languages:i}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";y.call(this,this.media.textTracks,r,he.update.bind(this))}setTimeout(he.update.bind(this),0)}},update:function(){var e=this,t=he.getTracks.call(this,!0),n=this.captions,i=n.active,a=n.language,s=n.meta,o=n.currentTrackNode,r=Boolean(t.find(function(e){return e.language===a}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!s.get(e)}).forEach(function(t){e.debug.log("Track added",t),s.set(t,{default:"showing"===t.mode}),t.mode="hidden",y.call(e,t,"cuechange",function(){return he.updateCues.call(e)})}),(r&&this.language!==a||!t.includes(o))&&(he.setLanguage.call(this,a),he.toggle.call(this,i&&r)),L(this.elements.container,this.config.classNames.captions.enabled,!m.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&ce.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,a=m.nullOrUndefined(e)?!n:e;if(a!==n){if(t||(this.captions.active=a,this.storage.set({captions:a})),!this.language&&a&&!t){var o=he.getTracks.call(this),r=he.findTrack.call(this,[this.captions.language].concat(s(this.captions.languages)),!0);return this.captions.language=r.language,void he.set.call(this,o.indexOf(r))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=a),L(this.elements.container,i,a),this.captions.toggled=a,ce.updateSetting.call(this,"captions"),k.call(this,this.media,a?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=he.getTracks.call(this);if(-1!==e)if(m.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],a=(i||{}).language;this.captions.currentTrackNode=i,ce.updateSetting.call(this,"captions"),t||(this.captions.language=a,this.storage.set({language:a})),this.isVimeo&&this.embed.enableTextTrack(a),k.call(this,this.media,"languagechange")}he.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&he.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else he.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(m.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=he.getTracks.call(this),a=he.findTrack.call(this,[n]);he.set.call(this,i.indexOf(a),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)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=he.getTracks.call(this),s=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(a).sort(function(e,t){return s(t)-s(e)});return e.every(function(e){return!(t=o.find(function(t){return t.language===e}))}),t||(i?o[0]:void 0)},getCurrentTrack:function(){return he.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!m.track(t)&&z.textTracks&&this.captions.toggled&&(t=he.getCurrentTrack.call(this)),m.track(t)?m.empty(t.label)?m.empty(t.language)?te("enabled",this.config):e.language.toUpperCase():t.label:te("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(m.element(this.elements.captions))if(m.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=he.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(Z)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){P(this.elements.captions);var a=A("span",M(this.config.selectors.caption));a.innerHTML=i,this.elements.captions.appendChild(a),k.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},pe={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!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]},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",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",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:{download:null,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,download: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","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","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"]',download:'[data-plyr="download"]',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",controlPressed:"plyr__control--pressed",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",display:{time:"plyr__time"},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:""}},me={html5:"html5",youtube:"youtube",vimeo:"vimeo"},fe={audio:"audio",video:"video"};var ge=function(){},ye=function(){function t(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e(this,t),this.enabled=window.console&&n,this.enabled&&this.log("Debugging enabled")}return n(t,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):ge}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):ge}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):ge}}]),t}();function ve(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;m.element(e)&&(e.pressed=this.active),k.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),F.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(m.element(e)){var n=_.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],a=n[n.length-1];g.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==a||e.shiftKey?t===i&&e.shiftKey&&(a.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function be(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",L(this.target,this.player.config.classNames.fullscreen.fallback,t),F.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var a=m.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!a,a||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return V(e.target)},100)}ve.call(this)}var ke=function(){function t(n){var i=this;e(this,t),this.player=n,this.prefix=t.prefix,this.property=t.property,this.scrollPosition={x:0,y:0},y.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){ve.call(i)}),y.call(this.player,this.player.elements.container,"dblclick",function(e){m.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.toggle()}),this.update()}return n(t,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(t.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),L(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(F.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():t.native?this.prefix?m.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():be.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(F.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(t.native)if(this.prefix){if(!m.empty(this.prefix)){var e="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(e).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else be.call(this,!1)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"enabled",get:function(){return(t.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&&(t.native?(this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:x(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return F.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(m.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!m.function(document["".concat(t,"ExitFullscreen")])&&!m.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),t}();function we(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise(function(n,i){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?n:i)(a)};Object.assign(a,{onload:s,onerror:s,src:e})})}var Te={addStyleHook:function(){L(this.elements.container,this.config.selectors.container.replace(".",""),!0),L(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 ".concat(this.provider," ").concat(this.type)),void Te.toggleNativeControls.call(this,!0);m.element(this.elements.controls)||(ce.inject.call(this),this.listeners.controls()),Te.toggleNativeControls.call(this),this.isHTML5&&he.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,ce.updateVolume.call(this),ce.timeUpdate.call(this),Te.checkPlaying.call(this),L(this.elements.container,this.config.classNames.pip.supported,z.pip&&this.isHTML5&&this.isVideo),L(this.elements.container,this.config.classNames.airplay.supported,z.airplay&&this.isHTML5),L(this.elements.container,this.config.classNames.isIos,F.isIos),L(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){k.call(e,e.media,"ready")},0),Te.setTitle.call(this),this.poster&&Te.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&ce.durationUpdate.call(this)},setTitle:function(){var e=te("play",this.config);if(m.string(this.config.title)&&!m.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=j.call(this,"iframe");if(!m.element(t))return;var n=m.empty(this.config.title)?"video":this.config.title,i=te("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){L(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):y.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return we(e)}).catch(function(n){throw e===t.poster&&Te.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),Te.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;L(this.elements.container,this.config.classNames.playing,this.playing),L(this.elements.container,this.config.classNames.paused,this.paused),L(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),m.event(e)&&"timeupdate"===e.type||Te.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(){L(t.elements.container,t.config.classNames.loading,t.loading),Te.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}}},Ae=function(){function t(n){e(this,t),this.player=n,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return n(t,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&m.number(i)){if(a){var o=document.activeElement;if(m.element(o)){var r=t.config.selectors.editable;if(o!==n.inputs.seek&&I(o,r))return;if(32===e.which&&I(o,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:s||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:s||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:s||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:s||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){ce.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,L(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,a=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||a)i=t.config.classNames.tabFocus,L(_.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&L(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&g.call(t,window,"keydown keyup",this.handleKey,e,!1),g.call(t,document.body,"click",this.toggleMenu,e),b.call(t,document.body,"touchstart",this.firstTouch),g.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&y.call(e,t.container,"keydown keyup",this.handleKey,!1),y.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(Te.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return Te.toggleControls.call(e,!1)},a)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(y.call(e,e.media,"timeupdate seeking seeked",function(t){return ce.timeUpdate.call(e,t)}),y.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return ce.durationUpdate.call(e,t)}),y.call(e,e.media,"canplay",function(){N(t.volume,!e.hasAudio),N(t.buttons.mute,!e.hasAudio)}),y.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),y.call(e,e.media,"progress playing seeking seeked",function(t){return ce.updateProgress.call(e,t)}),y.call(e,e.media,"volumechange",function(t){return ce.updateVolume.call(e,t)}),y.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return Te.checkPlaying.call(e,t)}),y.call(e,e.media,"waiting canplay seeked playing",function(t){return Te.checkLoading.call(e,t)}),y.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=j.call(e,".".concat(e.config.classNames.video));if(!m.element(n))return;y.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&y.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),y.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),y.call(e,e.media,"ratechange",function(){ce.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),y.call(e,e.media,"qualitychange",function(t){ce.updateSetting.call(e,"quality",null,t.detail.quality)}),y.call(e,e.media,"ready qualitychange",function(){ce.setDownloadLink.call(e)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");y.call(e,e.media,i,function(n){var i=n.detail,a=void 0===i?{}:i;"error"===n.type&&(a=e.media.error),k.call(e,t.container,n.type,!0,a)})}},{key:"proxy",value:function(e,t,n){var i=this.player,a=i.config.listeners[n],s=!0;m.function(a)&&(s=a.call(i,e)),s&&m.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var a=this,s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=this.player,r=o.config.listeners[i],l=m.function(r);y.call(o,e,t,function(e){return a.proxy(e,n,i)},s&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=F.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.download,"click",function(){k.call(t,t.media,"download")},"download"),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),ce.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),ce.toggleMenu.call(t,e)):ce.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&ce.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!m.keyboardEvent(e)||39===i||37===i){t.lastSeekTime=Date.now();var a=n.hasAttribute("play-on-seeked"),s=["mouseup","touchend","keyup"].includes(e.type);a&&s?(n.removeAttribute("play-on-seeked"),t.play()):!s&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),F.isIos){var s=_.call(t,'input[type="range"]');Array.from(s).forEach(function(t){return e.bind(t,i,function(e){return V(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");m.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return ce.updateSeekTooltip.call(t,e)}),F.isWebkit&&Array.from(_.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return ce.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!m.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,ce.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin",function(){var n=t.config,i=t.elements,a=t.timers;L(i.controls,n.classNames.noTransition,!0),Te.toggleControls.call(t,!0),setTimeout(function(){L(i.controls,n.classNames.noTransition,!1)},0);var s=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout(function(){return Te.toggleControls.call(t,!1)},s)}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=a([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),s=i[0],o=i[1],r=Math.sign(Math.abs(s)>Math.abs(o)?s:o);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()},"volume",!1)}}]),t}();"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ee,Ce=(function(e,t){var n;n=function(){var e=function(){},t={},n={},i={};function a(e,t){if(e){var a=i[e];if(n[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function s(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function o(t,n,i,a){var s,r,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(t)?(s=!0,(r=l.createElement("link")).rel="stylesheet",r.href=h):/(^img!|\.(png|gif|jpg|svg)$)/.test(t)?(r=l.createElement("img")).src=h:((r=l.createElement("script")).src=t,r.async=void 0===c||c),r.onload=r.onerror=r.onbeforeload=function(e){var l=e.type[0];if(s&&"hideFocus"in r)try{r.sheet.cssText.length||(l="e")}catch(e){l="e"}if("e"==l&&(a+=1)<u)return o(t,n,i,a);n(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function r(e,n,i){var r,l;if(n&&n.trim&&(r=n),l=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}!function(e,t,n){var i,a,s=(e=e.push?e:[e]).length,r=s,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--s||t(l)},a=0;a<r;a++)o(e[a],i,n)}(e,function(e){s(l,e),a(r,e)},l)}return r.ready=function(e,t){return function(e,t){e=e.push?e:[e];var a,s,o,r=[],l=e.length,c=l;for(a=function(e,n){n.length&&r.push(e),--c||t(r)};l--;)s=e[l],(o=n[s])?a(s,o):(i[s]=i[s]||[]).push(a)}(e,function(e){s(t,e)}),r},r.done=function(e){a(e,[])},r.reset=function(){t={},n={},i={}},r.isDefined=function(e){return e in t},r},e.exports=n()}(Ee={exports:{}},Ee.exports),Ee.exports);function Pe(e){return new Promise(function(t,n){Ce(e,{success:t,error:n})})}function Se(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Me={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),Me.setAspectRatio.call(this),m.object(window.Vimeo)?Me.ready.call(this):Pe(this.config.urls.vimeo.sdk).then(function(){Me.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=a((m.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=de({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");m.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var a,s=(a=i,m.empty(a)?null:m.number(Number(a))?a:a.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:a),o=A("iframe"),r=Q(t.config.urls.vimeo.iframe,s,n);o.setAttribute("src",r),o.setAttribute("allowfullscreen",""),o.setAttribute("allowtransparency",""),o.setAttribute("allow","autoplay");var l=A("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(o),t.media=S(l,t.media),ie(Q(t.config.urls.vimeo.api,s),"json").then(function(e){if(!m.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),Te.setPoster.call(t,n.href).catch(function(){})}}),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 Se.call(t,!0),t.embed.play()},t.media.pause=function(){return Se.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,a=t.paused,s=t.volume,o=a&&!n.hasPlayed;i.seeking=!0,k.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(s)}).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,k.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&ce.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,k.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!m.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,k.call(t,t.media,"volumechange")})}});var p,f=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return f},set:function(e){var n=m.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){f=n})}}),t.embed.getVideoUrl().then(function(e){p=e,ce.setDownloadLink.call(t)}).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"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Me.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,Te.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,k.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,k.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,he.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});he.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){Se.call(t,!e),e||k.call(t,t.media,"playing")}),m.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){Se.call(t,!0),k.call(t,t.media,"playing")}),t.embed.on("pause",function(){Se.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,k.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,k.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&k.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,k.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,k.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,k.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,k.call(t,t.media,"error")}),setTimeout(function(){return Te.build.call(t)},0)}};function Ne(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,k.call(this,this.media,e?"play":"pause"))}var Le,xe={setup:function(){var e=this;L(this.elements.wrapper,this.config.classNames.embed,!0),xe.setAspectRatio.call(this),m.object(window.YT)&&m.function(window.YT.Player)?xe.ready.call(this):(Pe(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(){xe.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(m.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(m.empty(n))return this.config.title=n,void Te.setTitle.call(this)}var i=this.config.keys.google;m.string(i)&&!m.empty(i)&&ie(Q(this.config.urls.youtube.api,e,i)).then(function(e){m.object(e)&&(t.config.title=e.items[0].snippet.title,Te.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(m.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");m.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,a,s=(i=n,m.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),o=(a=e.provider,"".concat(a,"-").concat(Math.floor(1e4*Math.random()))),r=A("div",{id:o,poster:e.poster});e.media=S(r,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(s,"/").concat(e,"default.jpg")};we(l("maxres"),121).catch(function(){return we(l("sd"),121)}).catch(function(){return we(l("hq"))}).then(function(t){return Te.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(o,{videoId:s,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,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(!e.media.error){var n=t.data,i={2:"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.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},k.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),k.call(e,e.media,"ratechange")},onReady:function(t){if(!m.function(e.media.play)){var n=t.target;xe.getTitle.call(e,s),e.media.play=function(){Ne.call(e,!0),n.playVideo()},e.media.pause=function(){Ne.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.hasPlayed&&e.embed.mute(),e.media.seeking=!0,k.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),k.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var i=m.boolean(t)?t:a;a=i,n[i?"mute":"unMute"](),k.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),k.call(e,e.media,"timeupdate"),k.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)&&k.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),k.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return Te.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,k.call(e,e.media,"seeked")),t.data){case-1:k.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),k.call(e,e.media,"progress");break;case 0:Ne.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):k.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Ne.call(e,!0),k.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){k.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),k.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Ne.call(e,!1)}k.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ie={setup:function(){this.media?(L(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),L(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&L(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=A("div",{class:this.config.classNames.video}),w(this.media,this.elements.wrapper),this.elements.poster=A("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?W.extend.call(this):this.isYouTube?xe.setup.call(this):this.isVimeo&&Me.setup.call(this)):this.debug.warn("No media element found!")}},_e=function(){function t(n){var i=this;e(this,t),this.player=n,this.publisherId=n.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 n(t,[{key:"load",value:function(){var e=this;this.enabled&&(m.object(window.google)&&m.object(window.google.ima)?this.ready():Pe(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=A("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=le(Math.max(e.manager.getRemainingTime(),0)),n="".concat(te("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),m.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(m.element(n)){var i=100/t.player.duration*e,a=A("span",{class:t.player.config.classNames.cues});a.style.left="".concat(i.toString(),"%"),n.appendChild(a)}}}),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(),a=function(e){var n="ads".concat(e.replace(/_/g,"").toLowerCase());k.call(t.player,t.player.media,n)};switch(e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),a(e.type),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.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,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;m.empty(t.cuePoints)||t.cuePoints.forEach(function(i,a){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(a,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.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=new Array(n>1?n-1:0),a=1;a<n;a++)i[a-1]=arguments[a];var s=this.events[e];m.array(s)&&s.forEach(function(e){m.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return m.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: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){m.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!m.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(de(e))}}]),t}(),je={insertElements:function(e,t){var n=this;m.string(t)?E(e,this.media,{src:t}):m.array(t)&&t.forEach(function(t){E(e,n.media,t)})},change:function(e){var t=this;Y(e,"sources.length")?(W.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],C(t.media),t.media=null,m.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,s=a(n,1)[0],o=s.provider,r=void 0===o?me.html5:o,l=s.src,c="html5"===r?i:"div",u="html5"===r?{}:{src:l};Object.assign(t,{provider:r,type:i,supported:z.check(i,r,t.config.playsinline),media:A(c,u)}),t.elements.container.appendChild(t.media),m.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),m.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","")),Te.addStyleHook.call(t),t.isHTML5&&je.insertElements.call(t,"source",n),t.config.title=e.title,Ie.setup.call(t),t.isHTML5&&("tracks"in e&&je.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&Te.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Oe=function(){function t(n,i){var a=this;if(e(this,t),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=z.touch,this.media=n,m.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||m.nodeList(this.media)||m.array(this.media))&&(this.media=this.media[0]),this.config=J({},pe,t.defaults,i||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new ye(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",z),!m.nullOrUndefined(this.media)&&m.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(z.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var o=this.media.tagName.toLowerCase(),r=null,l=null;switch(o){case"div":if(r=this.media.querySelector("iframe"),m.element(r)){if(l=ue(r.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?me.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?me.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",l.search.length){var c=["1","true"];c.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(l.searchParams.get("playsinline")),this.config.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(m.empty(this.provider)||!Object.keys(me).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=fe.video;break;case"video":case"audio":this.type=o,this.provider=me.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-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=z.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Ae(this),this.storage=new ne(this),this.media.plyr=this,m.element(this.elements.container)||(this.elements.container=A("div"),w(this.media,this.elements.container)),Te.addStyleHook.call(this),Ie.setup.call(this),this.config.debug&&y.call(this,this.elements.container,this.config.events.join(" "),function(e){a.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Te.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new ke(this),this.config.ads.enabled&&(this.ads=new _e(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0):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 n(t,[{key:"play",value:function(){return m.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&m.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(m.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):m.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(m.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(m.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(m.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){he.toggle.call(this,e,!1)}},{key:"airplay",value:function(){z.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=x(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=L(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!m.empty(this.config.settings)&&ce.toggleMenu.call(this,!1),i!==t){var a=i?"controlshidden":"controlsshown";k.call(this,this.media,a)}return!i}return!1}},{key:"on",value:function(e,t){y.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){b.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){v(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&&(C(t.elements.buttons.play),C(t.elements.captions),C(t.elements.controls),C(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),m.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,a=e.options;t.removeEventListener(n,i,a)}),this.eventListeners=[])}.call(t),S(t.elements.original,t.elements.container),k.call(t,t.elements.original,"destroyed",!0),m.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),Te.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&m.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return z.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===me.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===me.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===me.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===fe.video)}},{key:"isAudio",get:function(){return Boolean(this.type===fe.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=m.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return m.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,n=m.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;m.string(t)&&(t=Number(t)),m.number(t)||(t=this.storage.get("volume")),m.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!m.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;m.boolean(t)||(t=this.storage.get("muted")),m.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;m.number(e)&&(t=e),m.number(t)||(t=this.storage.get("speed")),m.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 (".concat(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=[!m.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(m.number);if(!n.includes(i)){var a=function(e,t){return m.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: ".concat(i,", using ").concat(a," instead")),i=a}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=m.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){je.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return m.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?Te.setPoster.call(this,e,!1).catch(function(){}):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=m.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){he.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){he.setLanguage.call(this,e,!1)},get:function(){return(he.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(z.pip){var i=m.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return z.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return z.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return ae(e,t)}},{key:"setup",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return m.string(e)?i=Array.from(document.querySelectorAll(e)):m.nodeList(e)?i=Array.from(e):m.array(e)&&(i=e.filter(m.element)),m.empty(i)?null:i.map(function(e){return new t(e,n)})}}]),t}();return Oe.defaults=(Le=pe,JSON.parse(JSON.stringify(Le))),Oe}); //# sourceMappingURL=plyr.min.js.map diff --git a/dist/plyr.min.js.map b/dist/plyr.min.js.map index d5425a75..1e1e4287 100644 --- a/dist/plyr.min.js.map +++ b/dist/plyr.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isString","String","isArray","Array","isNodeList","NodeList","isEmpty","length","keys","is","nullOrUndefined","object","number","Number","isNaN","string","boolean","function","Function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","event","Event","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","URL","startsWith","concat","hostname","e","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","_this","this","toggle","arguments","undefined","passive","capture","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","wrap","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","_ref","value","_slicedToArray","_ref3","_ref4","key","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","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","repaint","setTimeout","offsetHeight","range","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","source","getAttribute","getQualityOptions","extend","player","set","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","indexOf","getDeep","path","reduce","obj","target","sources","shift","_defineProperty","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","button","control","createRange","min","max","step","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","preventDefault","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","Math","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sort","a","b","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","floor","random","props","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","console","onChange","first","last","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","proxy","inputEvent","rect","currentTarget","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","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","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","attribute","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","original","getProviderByUrl","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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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);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './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(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\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:\n '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\n // Quality\n 'qualitychange',\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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\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\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && 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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.4\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isString","String","isArray","Array","isNodeList","NodeList","isEmpty","length","keys","is","nullOrUndefined","object","number","Number","isNaN","string","boolean","function","Function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","event","Event","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","url","URL","startsWith","concat","hostname","e","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","_this","this","toggle","arguments","undefined","passive","capture","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","_len","args","_key","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","wrap","elements","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","_ref","value","_slicedToArray","_ref3","_ref4","key","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","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","includes","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","repaint","setTimeout","offsetHeight","range","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","source","getAttribute","getQualityOptions","extend","player","set","_player$media","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","indexOf","getDeep","path","reduce","obj","target","sources","shift","_defineProperty","format","toString","match","i","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","slice","getHTML","innerHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","store","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","Promise","resolve","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","then","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","location","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","control","button","createRange","min","max","step","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","preventDefault","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","Math","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sort","a","b","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","create","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this10","floor","random","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","active","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","console","onChange","first","last","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","proxy","inputEvent","rect","currentTarget","hasAttribute","done","seekTo","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","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","loadjs","paths","arg1","arg2","fn","numWaiting","loadFiles","deps","bundleIds","r","subscribe","isDefined","module","exports","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","w","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","attribute","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","original","getProviderByUrl","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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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);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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 attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\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 props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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 // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n '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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\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 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\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 download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // 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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && 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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = (100 / x) * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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 controls.setDownloadLink.call(player);\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.5\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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 b4195616..c42d1a43 100644 --- a/dist/plyr.polyfilled.js +++ b/dist/plyr.polyfilled.js @@ -2804,6 +2804,11 @@ typeof navigator === "object" && (function (global, factory) { // Accept a URL object if (instanceOf(input, window.URL)) { return true; + } // Must be string from here + + + if (!isString(input)) { + return false; } // Add the protocol if required @@ -3669,6 +3674,13 @@ typeof navigator === "object" && (function (global, factory) { return wrapper.innerHTML; } + var resources = { + pip: 'PIP', + airplay: 'AirPlay', + html5: 'HTML5', + vimeo: 'Vimeo', + youtube: 'YouTube' + }; var i18n = { get: function get() { var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; @@ -3681,6 +3693,10 @@ typeof navigator === "object" && (function (global, factory) { var string = getDeep(config.i18n, key); if (is$1.empty(string)) { + if (Object.keys(resources).includes(key)) { + return resources[key]; + } + return ''; } @@ -3993,23 +4009,18 @@ typeof navigator === "object" && (function (global, factory) { if ('href' in use) { use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); - } else { - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); - } // Add <use> to <svg> + } // Always set the older attribute even though it's "deprecated" (it'll be around for ages) + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg> + icon.appendChild(use); return icon; }, // Create hidden text label - createLabel: function createLabel(type) { + createLabel: function createLabel(key) { var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Skip i18n for abbreviations and brand names - var universals = { - pip: 'PIP', - airplay: 'AirPlay' - }; - var text = universals[type] || i18n.get(type, this.config); + var text = i18n.get(key, this.config); var attributes = Object.assign({}, attr, { class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') }); @@ -4031,20 +4042,29 @@ typeof navigator === "object" && (function (global, factory) { }, // Create a <button> createButton: function createButton(buttonType, attr) { - var button = createElement('button'); var attributes = Object.assign({}, attr); var type = toCamelCase(buttonType); - var toggle = false; - var label; - var icon; - var labelPressed; - var iconPressed; + var props = { + element: 'button', + toggle: false, + label: null, + icon: null, + labelPressed: null, + iconPressed: null + }; + ['element', 'icon', 'label'].forEach(function (key) { + if (Object.keys(attributes).includes(key)) { + props[key] = attributes[key]; + delete attributes[key]; + } + }); // Default to 'button' type to prevent form submission - if (!('type' in attributes)) { + if (props.element === 'button' && !Object.keys(attributes).includes('type')) { attributes.type = 'button'; - } + } // Set class name - if ('class' in attributes) { + + if (Object.keys(attributes).includes('class')) { if (!attributes.class.includes(this.config.classNames.control)) { attributes.class += " ".concat(this.config.classNames.control); } @@ -4055,69 +4075,76 @@ typeof navigator === "object" && (function (global, factory) { switch (buttonType) { case 'play': - toggle = true; - label = 'play'; - labelPressed = 'pause'; - icon = 'play'; - iconPressed = 'pause'; + props.toggle = true; + props.label = 'play'; + props.labelPressed = 'pause'; + props.icon = 'play'; + props.iconPressed = 'pause'; break; case 'mute': - toggle = true; - label = 'mute'; - labelPressed = 'unmute'; - icon = 'volume'; - iconPressed = 'muted'; + props.toggle = true; + props.label = 'mute'; + props.labelPressed = 'unmute'; + props.icon = 'volume'; + props.iconPressed = 'muted'; break; case 'captions': - toggle = true; - label = 'enableCaptions'; - labelPressed = 'disableCaptions'; - icon = 'captions-off'; - iconPressed = 'captions-on'; + props.toggle = true; + props.label = 'enableCaptions'; + props.labelPressed = 'disableCaptions'; + props.icon = 'captions-off'; + props.iconPressed = 'captions-on'; break; case 'fullscreen': - toggle = true; - label = 'enterFullscreen'; - labelPressed = 'exitFullscreen'; - icon = 'enter-fullscreen'; - iconPressed = 'exit-fullscreen'; + props.toggle = true; + props.label = 'enterFullscreen'; + props.labelPressed = 'exitFullscreen'; + props.icon = 'enter-fullscreen'; + props.iconPressed = 'exit-fullscreen'; break; case 'play-large': attributes.class += " ".concat(this.config.classNames.control, "--overlaid"); type = 'play'; - label = 'play'; - icon = 'play'; + props.label = 'play'; + props.icon = 'play'; break; default: - label = type; - icon = buttonType; - } // Setup toggle icon and labels + if (is$1.empty(props.label)) { + props.label = type; + } + + if (is$1.empty(props.icon)) { + props.icon = buttonType; + } + } - if (toggle) { + var button = createElement(props.element); // Setup toggle icon and labels + + if (props.toggle) { // Icon - button.appendChild(controls.createIcon.call(this, iconPressed, { + button.appendChild(controls.createIcon.call(this, props.iconPressed, { class: 'icon--pressed' })); - button.appendChild(controls.createIcon.call(this, icon, { + button.appendChild(controls.createIcon.call(this, props.icon, { class: 'icon--not-pressed' })); // Label/Tooltip - button.appendChild(controls.createLabel.call(this, labelPressed, { + button.appendChild(controls.createLabel.call(this, props.labelPressed, { class: 'label--pressed' })); - button.appendChild(controls.createLabel.call(this, label, { + button.appendChild(controls.createLabel.call(this, props.label, { class: 'label--not-pressed' })); } else { - button.appendChild(controls.createIcon.call(this, icon)); - button.appendChild(controls.createLabel.call(this, label)); - } // Merge attributes + button.appendChild(controls.createIcon.call(this, props.icon)); + button.appendChild(controls.createLabel.call(this, props.label)); + } // Merge and set attributes extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes)); @@ -4970,6 +4997,17 @@ typeof navigator === "object" && (function (global, factory) { controls.focusFirstMenuItem.call(this, target, tabFocus); }, + // Set the download link + setDownloadLink: function setDownloadLink() { + var button = this.elements.buttons.download; // Bail if no button + + if (!is$1.element(button)) { + return; + } // Set download link + + + button.setAttribute('href', this.download); + }, // Build the default HTML // TODO: Set order based on order in the config.controls array? create: function create(data) { @@ -5175,6 +5213,25 @@ typeof navigator === "object" && (function (global, factory) { if (this.config.controls.includes('airplay') && support.airplay) { container.appendChild(controls.createButton.call(this, 'airplay')); + } // Download button + + + if (this.config.controls.includes('download')) { + var _attributes = { + element: 'a', + href: this.download, + target: '_blank' + }; + var download = this.config.urls.download; + + if (!is$1.url(download) && this.isEmbed) { + extend(_attributes, { + icon: "logo-".concat(this.provider), + label: this.provider + }); + } + + container.appendChild(controls.createButton.call(this, 'download', _attributes)); } // Toggle fullscreen button @@ -5841,7 +5898,8 @@ typeof navigator === "object" && (function (global, factory) { controls: ['play-large', // 'restart', // 'rewind', 'play', // 'fast-forward', - 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen'], + 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download', + 'fullscreen'], settings: ['captions', 'quality', 'speed'], // Localisation i18n: { @@ -5861,6 +5919,7 @@ typeof navigator === "object" && (function (global, factory) { unmute: 'Unmute', enableCaptions: 'Enable captions', disableCaptions: 'Disable captions', + download: 'Download', enterFullscreen: 'Enter fullscreen', exitFullscreen: 'Exit fullscreen', frameTitle: 'Player for {title}', @@ -5889,6 +5948,7 @@ typeof navigator === "object" && (function (global, factory) { }, // URLs urls: { + download: null, vimeo: { sdk: 'https://player.vimeo.com/api/player.js', iframe: 'https://player.vimeo.com/video/{0}?{1}', @@ -5913,6 +5973,7 @@ typeof navigator === "object" && (function (global, factory) { mute: null, volume: null, captions: null, + download: null, fullscreen: null, pip: null, airplay: null, @@ -5925,7 +5986,7 @@ typeof navigator === "object" && (function (global, factory) { events: [// Events to watch on HTML5 media elements and bubble // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events - 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube + 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube 'statechange', // Quality 'qualitychange', // Ads 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'], @@ -5947,6 +6008,7 @@ typeof navigator === "object" && (function (global, factory) { fastForward: '[data-plyr="fast-forward"]', mute: '[data-plyr="mute"]', captions: '[data-plyr="captions"]', + download: '[data-plyr="download"]', fullscreen: '[data-plyr="fullscreen"]', pip: '[data-plyr="pip"]', airplay: '[data-plyr="airplay"]', @@ -6059,7 +6121,7 @@ typeof navigator === "object" && (function (global, factory) { }; /** * Get provider by URL - * @param {string} url + * @param {String} url */ function getProviderByUrl(url) { @@ -6596,8 +6658,10 @@ typeof navigator === "object" && (function (global, factory) { var controls$$1 = this.elements.controls; if (controls$$1 && this.config.hideControls) { - // Show controls if force, loading, paused, or button interaction, otherwise hide - this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover)); + // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.) + var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide + + this.toggleControls(Boolean(force || this.loading || this.paused || controls$$1.pressed || controls$$1.hover || recentTouchSeek)); } } }; @@ -6956,7 +7020,7 @@ typeof navigator === "object" && (function (global, factory) { if (!is$1.element(wrapper)) { return; - } // On click play, pause ore restart + } // On click play, pause or restart on.call(player, elements.container, 'click', function (event) { @@ -7009,6 +7073,10 @@ typeof navigator === "object" && (function (global, factory) { on.call(player, player.media, 'qualitychange', function (event) { // Update UI controls.updateSetting.call(player, 'quality', null, event.detail.quality); + }); // Update download link when ready and if quality changes + + on.call(player, player.media, 'ready qualitychange', function () { + controls.setDownloadLink.call(player); }); // Proxy events to container // Bubble up key events for Edge @@ -7086,7 +7154,11 @@ typeof navigator === "object" && (function (global, factory) { this.bind(elements.buttons.captions, 'click', function () { return player.toggleCaptions(); - }); // Fullscreen toggle + }); // Download + + this.bind(elements.buttons.download, 'click', function () { + triggerEvent.call(player, player.media, 'download'); + }, 'download'); // Fullscreen toggle this.bind(elements.buttons.fullscreen, 'click', function () { player.fullscreen.toggle(); @@ -7149,8 +7221,10 @@ typeof navigator === "object" && (function (global, factory) { if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) { return; - } // Was playing before? + } // Record seek time so we can prevent hiding controls for a few seconds after seek + + player.lastSeekTime = Date.now(); // Was playing before? var play = seek.hasAttribute(attribute); // Done seeking @@ -7228,32 +7302,28 @@ typeof navigator === "object" && (function (global, factory) { this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); - }); // Focus in/out on controls + }); // Show controls when they receive focus (e.g., when using keyboard tab key) - this.bind(elements.controls, 'focusin focusout', function (event) { + this.bind(elements.controls, 'focusin', function () { var config = player.config, elements = player.elements, - timers = player.timers; - var isFocusIn = event.type === 'focusin'; // Skip transition to prevent focus from scrolling the parent element + timers = player.timers; // Skip transition to prevent focus from scrolling the parent element - toggleClass(elements.controls, config.classNames.noTransition, isFocusIn); // Toggle + toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle - ui.toggleControls.call(player, isFocusIn); // If focusin, hide again after delay + ui.toggleControls.call(player, true); // Restore transition - if (isFocusIn) { - // Restore transition - setTimeout(function () { - toggleClass(elements.controls, config.classNames.noTransition, false); - }, 0); // Delay a little more for keyboard users + setTimeout(function () { + toggleClass(elements.controls, config.classNames.noTransition, false); + }, 0); // Delay a little more for mouse users - var delay = _this2.touch ? 3000 : 4000; // Clear timer + var delay = _this2.touch ? 3000 : 4000; // Clear timer - clearTimeout(timers.controls); // Hide + clearTimeout(timers.controls); // Hide again after delay - timers.controls = setTimeout(function () { - return ui.toggleControls.call(player, false); - }, delay); - } + timers.controls = setTimeout(function () { + return ui.toggleControls.call(player, false); + }, delay); }); // Mouse wheel for volume this.bind(elements.inputs.volume, 'wheel', function (event) { @@ -7864,6 +7934,7 @@ typeof navigator === "object" && (function (global, factory) { var currentSrc; player.embed.getVideoUrl().then(function (value) { currentSrc = value; + controls.setDownloadLink.call(player); }).catch(function (error) { _this2.debug.warn(error); }); @@ -9414,7 +9485,10 @@ typeof navigator === "object" && (function (global, factory) { if (this.config.autoplay) { this.play(); - } + } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek + + + this.lastSeekTime = 0; } // --------------------------------------- // API // --------------------------------------- @@ -10139,6 +10213,16 @@ typeof navigator === "object" && (function (global, factory) { return this.media.currentSrc; } /** + * Get a download URL (either source or custom) + */ + + }, { + key: "download", + get: function get() { + var download = this.config.urls.download; + return is$1.url(download) ? download : this.source; + } + /** * Set the poster image for a video * @param {input} - the URL for the new poster image */ diff --git a/dist/plyr.polyfilled.js.map b/dist/plyr.polyfilled.js.map index b44b2832..e985c109 100644 --- a/dist/plyr.polyfilled.js.map +++ b/dist/plyr.polyfilled.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","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/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.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/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.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/_string-ws.js","node_modules/core-js/modules/_string-trim.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/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.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.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_invoke.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/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.sign.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js","src/js/plyr.polyfilled.js"],"names":["global","this","aFunction","isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","core","ctx","redefine","defined","uid","Iterators","toInteger","$defineProperty","cof","ITERATOR","classof","$export","toObject","getIterFn","isArrayIter","createProperty","call","toLength","isArray","speciesConstructor","asc","IObject","ArrayProto","toIObject","pIE","min","toAbsoluteIndex","$keys","spaces","fails","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","gOPD","require$$3","require$$4","inheritIfRequired","require$$5","require$$6","isRegExp","MATCH","context","wks","DESCRIPTORS","$flags","TAG","create","descriptor","setToStringTag","$iterCreate","getPrototypeOf","step","addToUnscopables","proto","key","$iterators","gOPS","createArrayMethod","id","anInstance","forOf","redefineAll","validate","$has","meta","$iterDetect","weak","assign","SPECIES","invoke","cel","html","process","Promise","navigator","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","promiseResolve","LIBRARY","require$$7","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","dispatchEvent","unbindListeners","item","ready","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","gOPN","Base","i","generateId","prefix","floor","random","format","toString","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","universals","join","createBadge","badge","menu","createButton","buttonType","button","label","labelPressed","iconPressed","control","createRange","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","inner","home","backButton","inject","props","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","href","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","urls","vimeo","sdk","iframe","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","NAME","define","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","now","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\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(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\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})();\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', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\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(name, value);\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) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\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) {\r\n items.push([name, value]);\r\n });\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 searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\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 });\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 if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\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 // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\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 // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\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 if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\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']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\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 this._updateSearchParams();\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\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","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","// 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.7' };\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","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","// 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","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\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","module.exports = {};\n","module.exports = false;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\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","// 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","// 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","'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","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\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","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","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","'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","// 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.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","'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","exports.f = {}.propertyIsEnumerable;\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 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","// 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","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 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","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\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","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\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.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","// 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.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// 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","'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","// @@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';\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';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\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 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","// 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","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\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 = $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 && typeof IteratorPrototype[ITERATOR] != 'function') 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 $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","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 $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\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","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","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","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 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 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 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 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","// 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","// @@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","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 $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-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","// @@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","// 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","// 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","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 // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\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 global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\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 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 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 userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\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')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\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, exited;\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); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\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 if (domain && !exited) domain.exit();\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","// 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","// 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","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './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(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\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:\n '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\n // Quality\n 'qualitychange',\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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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","// 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.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\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\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\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","// @@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","(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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.4\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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.4.4\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\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/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","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/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.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/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.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/_string-ws.js","node_modules/core-js/modules/_string-trim.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/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.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.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_invoke.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/_user-agent.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/es6.promise.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","node_modules/core-js/modules/es6.math.sign.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js","src/js/plyr.polyfilled.js"],"names":["global","this","aFunction","isObject","require$$0","document","require$$1","require$$2","anObject","toPrimitive","IE8_DOM_DEFINE","dP","createDesc","has","hide","core","ctx","redefine","defined","uid","Iterators","toInteger","$defineProperty","cof","ITERATOR","classof","$export","toObject","getIterFn","isArrayIter","createProperty","call","toLength","isArray","speciesConstructor","asc","IObject","ArrayProto","toIObject","pIE","min","toAbsoluteIndex","$keys","spaces","fails","enumBugKeys","getKeys","IE_PROTO","PROTOTYPE","dPs","gOPD","require$$3","require$$4","inheritIfRequired","require$$5","require$$6","isRegExp","MATCH","context","wks","DESCRIPTORS","$flags","TAG","create","descriptor","setToStringTag","$iterCreate","getPrototypeOf","step","addToUnscopables","proto","key","$iterators","gOPS","createArrayMethod","id","anInstance","forOf","redefineAll","validate","$has","meta","$iterDetect","weak","assign","SPECIES","invoke","cel","html","process","Promise","navigator","newPromiseCapability","TypeError","isNode","newPromiseCapabilityModule","userAgent","perform","promiseResolve","LIBRARY","require$$7","getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","plyr","dispatchEvent","unbindListeners","item","ready","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","setAttribute","createElement","text","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","prototype","match","querySelectorAll","includes","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","err","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","gOPN","Base","i","generateId","prefix","floor","random","format","toString","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","vimeo","youtube","i18n","seekTime","title","Storage","enabled","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","control","button","createRange","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","setDownloadLink","download","inner","home","backButton","href","urls","isEmbed","inject","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","NAME","define","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","states","inline","webkitPresentationMode","t"],"mappings":"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","file":"plyr.polyfilled.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\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(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\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})();\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', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\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(name, value);\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) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\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) {\r\n items.push([name, value]);\r\n });\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 searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\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 });\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 if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\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 // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\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 // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\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 if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\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']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\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 this._updateSearchParams();\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\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","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","// 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.7' };\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","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","// 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","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\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","module.exports = {};\n","module.exports = false;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\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","// 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","// 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","'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","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\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","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","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","'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","// 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.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","'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","exports.f = {}.propertyIsEnumerable;\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 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","// 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","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 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","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\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","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\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.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","// 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.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// 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","'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","// @@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';\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';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\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 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","// 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","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\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 = $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 && typeof IteratorPrototype[ITERATOR] != 'function') 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 $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","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 $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\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","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","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","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 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 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 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 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","// 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","// @@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","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 $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-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","// @@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","// 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","// 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","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 // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\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 global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\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 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 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 userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\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')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\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, exited;\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); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\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 if (domain && !exited) domain.exit();\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","// 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","// 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","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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 attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\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 props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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 // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n '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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\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 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\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 download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // 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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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","// 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.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\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 support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\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","// @@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","(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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = (100 / x) * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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 controls.setDownloadLink.call(player);\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.5\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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.4.5\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\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 bf9e7d56..22bb84dc 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";!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=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};t.prototype=window.Event.prototype,window.CustomEvent=t}}();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}!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",{writable:!0,value:{}}),"string"==typeof e)""!==e&&this._fromString(e);else if(e instanceof o){var t=this;e.forEach(function(e,n){t.append(n,e)})}},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.push(i(n)+"="+i(t))}),e.join("&")},Object.defineProperty(a,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){this._entries={};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]):"")}}),e.URLSearchParams=o}(),"function"!=typeof URLSearchParams.prototype.sort&&(URLSearchParams.prototype.sort=function(){var e=this,t=[];this.forEach(function(n,i){t.push([i,n]),e._entries||e.delete(i)}),t.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0}),e._entries&&(e._entries={});for(var n=0;n<t.length;n++)this.append(t[n][0],t[n][1])})}(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(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=r.createElement("a");if(o.href=t,i&&(r.body.appendChild(o),o.href=o.href),":"===o.protocol||!/:/.test(o.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var a=new URLSearchParams(this.search),s=!0,l=!0,c=this;["append","delete","set"].forEach(function(e){var t=a[e];a[e]=function(){t.apply(a,arguments),s&&(l=!1,c.search=a.toString(),l=!0)}}),Object.defineProperty(this,"searchParams",{value:a,enumerable:!0});var u=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==u&&(u=this.search,l&&(s=!1,this.searchParams._fromString(this.search),s=!0))}})},i=n.prototype;["hash","host","hostname","port","protocol"].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.defineProperty(i,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),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,this._updateSearchParams()},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}}),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 n=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},i=function(e,t,i){if(n(e),void 0===t)return e;switch(i){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)}},r=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)}),o=t(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),a=(o.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),s=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e},l=function(e){try{return!!e()}catch(e){return!0}},c=!l(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),u=r.document,d=a(u)&&a(u.createElement),h=function(e){return d?u.createElement(e):{}},f=!c&&!l(function(){return 7!=Object.defineProperty(h("div"),"a",{get:function(){return 7}}).a}),p=function(e,t){if(!a(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!a(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},m=Object.defineProperty,g={f:c?Object.defineProperty:function(e,t,n){if(s(e),t=p(t,!0),s(n),f)try{return m(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}},y=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},v=c?function(e,t,n){return g.f(e,t,y(1,n))}:function(e,t,n){return e[t]=n,e},b={}.hasOwnProperty,k=function(e,t){return b.call(e,t)},w=0,T=Math.random(),E=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++w+T).toString(36))},A=t(function(e){var t=E("src"),n=Function.toString,i=(""+n).split("toString");o.inspectSource=function(e){return n.call(e)},(e.exports=function(e,n,o,a){var s="function"==typeof o;s&&(k(o,"name")||v(o,"name",n)),e[n]!==o&&(s&&(k(o,t)||v(o,t,e[n]?""+e[n]:i.join(String(n)))),e===r?e[n]=o:a?e[n]?e[n]=o:v(e,n,o):(delete e[n],v(e,n,o)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||n.call(this)})}),_=function(e,t,n){var a,s,l,c,u=e&_.F,d=e&_.G,h=e&_.S,f=e&_.P,p=e&_.B,m=d?r:h?r[t]||(r[t]={}):(r[t]||{}).prototype,g=d?o:o[t]||(o[t]={}),y=g.prototype||(g.prototype={});for(a in d&&(n=t),n)l=((s=!u&&m&&void 0!==m[a])?m:n)[a],c=p&&s?i(l,r):f&&"function"==typeof l?i(Function.call,l):l,m&&A(m,a,l,e&_.U),g[a]!=l&&v(g,a,c),f&&y[a]!=l&&(y[a]=l)};r.core=o,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;var S=_,P=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},C=function(e){return Object(P(e))},L=function(e,t,n,i){try{return i?t(s(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&s(r.call(e)),t}},M={},N=t(function(e){var t=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:o.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),x=t(function(e){var t=N("wks"),n=r.Symbol,i="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=i&&n[e]||(i?n:E)("Symbol."+e))}).store=t}),O=x("iterator"),j=Array.prototype,I=function(e){return void 0!==e&&(M.Array===e||j[O]===e)},R=Math.ceil,F=Math.floor,q=function(e){return isNaN(e=+e)?0:(e>0?F:R)(e)},D=Math.min,V=function(e){return e>0?D(q(e),9007199254740991):0},B=function(e,t,n){t in e?g.f(e,t,y(0,n)):e[t]=n},H={}.toString,U=function(e){return H.call(e).slice(8,-1)},W=x("toStringTag"),z="Arguments"==U(function(){return arguments}()),K=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),W))?n:z?U(t):"Object"==(i=U(t))&&"function"==typeof t.callee?"Arguments":i},Y=x("iterator"),G=o.getIteratorMethod=function(e){if(null!=e)return e[Y]||e["@@iterator"]||M[K(e)]},$=x("iterator"),J=!1;try{[7][$]().return=function(){J=!0}}catch(e){}var Q=function(e,t){if(!t&&!J)return!1;var n=!1;try{var i=[7],r=i[$]();r.next=function(){return{done:n=!0}},i[$]=function(){return r},e(i)}catch(e){}return n};S(S.S+S.F*!Q(function(e){}),"Array",{from:function(e){var t,n,r,o,a=C(e),s="function"==typeof this?this:Array,l=arguments.length,c=l>1?arguments[1]:void 0,u=void 0!==c,d=0,h=G(a);if(u&&(c=i(c,l>2?arguments[2]:void 0,2)),null==h||s==Array&&I(h))for(n=new s(t=V(a.length));t>d;d++)B(n,d,u?c(a[d],d):a[d]);else for(o=h.call(a),n=new s;!(r=o.next()).done;d++)B(n,d,u?L(o,c,[r.value,d],!0):r.value);return n.length=d,n}});var X=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==U(e)?e.split(""):Object(e)},Z=Array.isArray||function(e){return"Array"==U(e)},ee=x("species"),te=function(e,t){return new(function(e){var t;return Z(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!Z(t.prototype)||(t=void 0),a(t)&&null===(t=t[ee])&&(t=void 0)),void 0===t?Array:t}(e))(t)},ne=function(e,t){var n=1==e,r=2==e,o=3==e,a=4==e,s=6==e,l=5==e||s,c=t||te;return function(t,u,d){for(var h,f,p=C(t),m=X(p),g=i(u,d,3),y=V(m.length),v=0,b=n?c(t,y):r?c(t,0):void 0;y>v;v++)if((l||v in m)&&(f=g(h=m[v],v,p),e))if(n)b[v]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return v;case 2:b.push(h)}else if(a)return!1;return s?-1:o||a?a:b}},ie=x("unscopables"),re=Array.prototype;null==re[ie]&&v(re,ie,{});var oe=function(e){re[ie][e]=!0},ae=ne(5),se=!0;"find"in[]&&Array(1).find(function(){se=!1}),S(S.P+S.F*se,"Array",{find:function(e){return ae(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("find");var le={f:{}.propertyIsEnumerable},ce=function(e){return X(P(e))},ue=Object.getOwnPropertyDescriptor,de={f:c?ue:function(e,t){if(e=ce(e),t=p(t,!0),f)try{return ue(e,t)}catch(e){}if(k(e,t))return y(!le.f.call(e,t),e[t])}},he=function(e,t){if(s(e),!a(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},fe={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=i(Function.call,de.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return he(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:he}.set,pe=function(e,t,n){var i,r=t.constructor;return r!==n&&"function"==typeof r&&(i=r.prototype)!==n.prototype&&a(i)&&fe&&fe(e,i),e},me=Math.max,ge=Math.min,ye=function(e){return function(t,n,i){var r,o=ce(t),a=V(o.length),s=function(e,t){return(e=q(e))<0?me(e+t,0):ge(e,t)}(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}},ve=N("keys"),be=function(e){return ve[e]||(ve[e]=E(e))},ke=ye(!1),we=be("IE_PROTO"),Te=function(e,t){var n,i=ce(e),r=0,o=[];for(n in i)n!=we&&k(i,n)&&o.push(n);for(;t.length>r;)k(i,n=t[r++])&&(~ke(o,n)||o.push(n));return o},Ee="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Ae=Ee.concat("length","prototype"),_e={f:Object.getOwnPropertyNames||function(e){return Te(e,Ae)}},Se="\t\n\v\f\r \u2028\u2029\ufeff",Pe="["+Se+"]",Ce=RegExp("^"+Pe+Pe+"*"),Le=RegExp(Pe+Pe+"*$"),Me=function(e,t,n){var i={},r=l(function(){return!!Se[e]()||"
"!="
"[e]()}),o=i[e]=r?t(Ne):Se[e];n&&(i[n]=o),S(S.P+S.F*r,"String",i)},Ne=Me.trim=function(e,t){return e=String(P(e)),1&t&&(e=e.replace(Ce,"")),2&t&&(e=e.replace(Le,"")),e},xe=Me,Oe=Object.keys||function(e){return Te(e,Ee)},je=c?Object.defineProperties:function(e,t){s(e);for(var n,i=Oe(t),r=i.length,o=0;r>o;)g.f(e,n=i[o++],t[n]);return e},Ie=r.document,Re=Ie&&Ie.documentElement,Fe=be("IE_PROTO"),qe=function(){},De=function(){var e,t=h("iframe"),n=Ee.length;for(t.style.display="none",Re.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),De=e.F;n--;)delete De.prototype[Ee[n]];return De()},Ve=Object.create||function(e,t){var n;return null!==e?(qe.prototype=s(e),n=new qe,qe.prototype=null,n[Fe]=e):n=De(),void 0===t?n:je(n,t)},Be=_e.f,He=de.f,Ue=g.f,We=xe.trim,ze=r.Number,Ke=ze,Ye=ze.prototype,Ge="Number"==U(Ve(Ye)),$e="trim"in String.prototype,Je=function(e){var t=p(e,!1);if("string"==typeof t&&t.length>2){var n,i,r,o=(t=$e?t.trim():We(t,3)).charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var a,s=t.slice(2),l=0,c=s.length;l<c;l++)if((a=s.charCodeAt(l))<48||a>r)return NaN;return parseInt(s,i)}}return+t};if(!ze(" 0o1")||!ze("0b1")||ze("+0x1")){ze=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof ze&&(Ge?l(function(){Ye.valueOf.call(n)}):"Number"!=U(n))?pe(new Ke(Je(t)),n,ze):Je(t)};for(var Qe,Xe=c?Be(Ke):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Ze=0;Xe.length>Ze;Ze++)k(Ke,Qe=Xe[Ze])&&!k(ze,Qe)&&Ue(ze,Qe,He(Ke,Qe));ze.prototype=Ye,Ye.constructor=ze,A(r,"Number",ze)}!function(e,t){var n=(o.Object||{})[e]||Object[e],i={};i[e]=t(n),S(S.S+S.F*l(function(){n(1)}),"Object",i)}("keys",function(){return function(e){return Oe(C(e))}});var et=x("match"),tt=function(e){var t;return a(e)&&(void 0!==(t=e[et])?!!t:"RegExp"==U(e))},nt=function(e,t,n){if(tt(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(P(e))},it=x("match"),rt=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[it]=!1,!"/./"[e](t)}catch(e){}}return!0};S(S.P+S.F*rt("includes"),"String",{includes:function(e){return!!~nt(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});var ot=ye(!0);S(S.P,"Array",{includes:function(e){return ot(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("includes");var at=function(e,t,n){var i=x(e),r=n(P,i,""[e]),o=r[0],a=r[1];l(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(A(String.prototype,e,o),v(RegExp.prototype,i,2==t?function(e,t){return a.call(e,this,t)}:function(e){return a.call(e,this)}))};at("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 st=function(){var e=s(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};c&&"g"!=/./g.flags&&g.f(RegExp.prototype,"flags",{configurable:!0,get:st});var lt=/./.toString,ct=function(e){A(RegExp.prototype,"toString",e,!0)};l(function(){return"/a/b"!=lt.call({source:"a",flags:"b"})})?ct(function(){var e=s(this);return"/".concat(e.source,"/","flags"in e?e.flags:!c&&e instanceof RegExp?st.call(e):void 0)}):"toString"!=lt.name&&ct(function(){return lt.call(this)});var ut=function(e,t){return{value:t,done:!!e}},dt=g.f,ht=x("toStringTag"),ft=function(e,t,n){e&&!k(e=n?e:e.prototype,ht)&&dt(e,ht,{configurable:!0,value:t})},pt={};v(pt,x("iterator"),function(){return this});var mt=function(e,t,n){e.prototype=Ve(pt,{next:y(1,n)}),ft(e,t+" Iterator")},gt=be("IE_PROTO"),yt=Object.prototype,vt=Object.getPrototypeOf||function(e){return e=C(e),k(e,gt)?e[gt]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?yt:null},bt=x("iterator"),kt=!([].keys&&"next"in[].keys()),wt=function(){return this},Tt=function(e,t,n,i,r,o,a){mt(n,t,i);var s,l,c,u=function(e){if(!kt&&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)}},d=t+" Iterator",h="values"==r,f=!1,p=e.prototype,m=p[bt]||p["@@iterator"]||r&&p[r],g=m||u(r),y=r?h?u("entries"):g:void 0,b="Array"==t&&p.entries||m;if(b&&(c=vt(b.call(new e)))!==Object.prototype&&c.next&&(ft(c,d,!0),"function"!=typeof c[bt]&&v(c,bt,wt)),h&&m&&"values"!==m.name&&(f=!0,g=function(){return m.call(this)}),(kt||f||!p[bt])&&v(p,bt,g),M[t]=g,M[d]=wt,r)if(s={values:h?g:u("values"),keys:o?g:u("keys"),entries:y},a)for(l in s)l in p||A(p,l,s[l]);else S(S.P+S.F*(kt||f),t,s);return s},Et=Tt(Array,"Array",function(e,t){this._t=ce(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,ut(1)):ut(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");M.Arguments=M.Array,oe("keys"),oe("values"),oe("entries");for(var At=x("iterator"),_t=x("toStringTag"),St=M.Array,Pt={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},Ct=Oe(Pt),Lt=0;Lt<Ct.length;Lt++){var Mt,Nt=Ct[Lt],xt=Pt[Nt],Ot=r[Nt],jt=Ot&&Ot.prototype;if(jt&&(jt[At]||v(jt,At,St),jt[_t]||v(jt,_t,Nt),M[Nt]=St,xt))for(Mt in Et)jt[Mt]||A(jt,Mt,Et[Mt],!0)}var It=function(e){return function(t,n){var i,r,o=String(P(t)),a=q(n),s=o.length;return a<0||a>=s?e?"":void 0:(i=o.charCodeAt(a))<55296||i>56319||a+1===s||(r=o.charCodeAt(a+1))<56320||r>57343?e?o.charAt(a):i:e?o.slice(a,a+2):r-56320+(i-55296<<10)+65536}}(!0);Tt(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=It(t,n),this._i+=e.length,{value:e,done:!1})});var Rt=t(function(e){var t=E("meta"),n=g.f,i=0,r=Object.isExtensible||function(){return!0},o=!l(function(){return r(Object.preventExtensions({}))}),s=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!k(e,t)){if(!r(e))return"F";if(!n)return"E";s(e)}return e[t].i},getWeak:function(e,n){if(!k(e,t)){if(!r(e))return!0;if(!n)return!1;s(e)}return e[t].w},onFreeze:function(e){return o&&c.NEED&&r(e)&&!k(e,t)&&s(e),e}}}),Ft=(Rt.KEY,Rt.NEED,Rt.fastKey,Rt.getWeak,Rt.onFreeze,{f:Object.getOwnPropertySymbols}),qt=Object.assign,Dt=!qt||l(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=qt({},e)[n]||Object.keys(qt({},t)).join("")!=i})?function(e,t){for(var n=C(e),i=arguments.length,r=1,o=Ft.f,a=le.f;i>r;)for(var s,l=X(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,d=0;u>d;)a.call(l,s=c[d++])&&(n[s]=l[s]);return n}:qt,Vt=function(e,t,n){for(var i in t)A(e,i,t[i],n);return e},Bt=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},Ht=t(function(e){var t={},n={},r=e.exports=function(e,r,o,a,l){var c,u,d,h,f=l?function(){return e}:G(e),p=i(o,a,r?2:1),m=0;if("function"!=typeof f)throw TypeError(e+" is not iterable!");if(I(f)){for(c=V(e.length);c>m;m++)if((h=r?p(s(u=e[m])[0],u[1]):p(e[m]))===t||h===n)return h}else for(d=f.call(e);!(u=d.next()).done;)if((h=L(d,p,u.value,r))===t||h===n)return h};r.BREAK=t,r.RETURN=n}),Ut=function(e,t){if(!a(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e},Wt=Rt.getWeak,zt=ne(5),Kt=ne(6),Yt=0,Gt=function(e){return e._l||(e._l=new $t)},$t=function(){this.a=[]},Jt=function(e,t){return zt(e.a,function(e){return e[0]===t})};$t.prototype={get:function(e){var t=Jt(this,e);if(t)return t[1]},has:function(e){return!!Jt(this,e)},set:function(e,t){var n=Jt(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Kt(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Qt={getConstructor:function(e,t,n,i){var r=e(function(e,o){Bt(e,r,t,"_i"),e._t=t,e._i=Yt++,e._l=void 0,null!=o&&Ht(o,n,e[i],e)});return Vt(r.prototype,{delete:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).delete(e):n&&k(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).has(e):n&&k(n,this._i)}}),r},def:function(e,t,n){var i=Wt(s(t),!0);return!0===i?Gt(e).set(t,n):i[e._i]=n,e},ufstore:Gt};t(function(e){var t,n=ne(0),i=Rt.getWeak,o=Object.isExtensible,s=Qt.ufstore,c={},u=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},d={get:function(e){if(a(e)){var t=i(e);return!0===t?s(Ut(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Qt.def(Ut(this,"WeakMap"),e,t)}},h=e.exports=function(e,t,n,i,o,s){var c=r[e],u=c,d=o?"set":"add",h=u&&u.prototype,f={},p=function(e){var t=h[e];A(h,e,"delete"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return s&&!a(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&&(s||h.forEach&&!l(function(){(new u).entries().next()}))){var m=new u,g=m[d](s?{}:-0,1)!=m,y=l(function(){m.has(1)}),v=Q(function(e){new u(e)}),b=!s&&l(function(){for(var e=new u,t=5;t--;)e[d](t,t);return!e.has(-0)});v||((u=t(function(t,n){Bt(t,u,e);var i=pe(new c,t,u);return null!=n&&Ht(n,o,i[d],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),o&&p("get")),(b||g)&&p(d),s&&h.clear&&delete h.clear}else u=i.getConstructor(t,e,o,d),Vt(u.prototype,n),Rt.NEED=!0;return ft(u,e),f[e]=u,S(S.G+S.W+S.F*(u!=c),f),s||i.setStrong(u,e,o),u}("WeakMap",u,d,Qt,!0,!0);l(function(){return 7!=(new h).set((Object.freeze||Object)(c),7).get(c)})&&(t=Qt.getConstructor(u,"WeakMap"),Dt(t.prototype,d),Rt.NEED=!0,n(["delete","has","get","set"],function(e){var n=h.prototype,i=n[e];A(n,e,function(n,r){if(a(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,r);return"set"==e?this:s}return i.call(this,n,r)})}))});function Xt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Zt(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)}}function en(e,t,n){return t&&Zt(e.prototype,t),n&&Zt(e,n),e}function tn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function nn(e,t){return function(e){if(Array.isArray(e))return e}(e)||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||null==s.return||s.return()}finally{if(r)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function rn(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}S(S.S+S.F,"Object",{assign:Dt}),at("split",2,function(e,t,n){var i=tt,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,d,h=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,m=void 0===t?4294967295:t>>>0,g=new RegExp(e.source,f+"g");for(a||(s=new RegExp("^"+g.source+"$(?!\\s)",f));(l=g.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(d=1;d<arguments.length-2;d++)void 0===arguments[d]&&(l[d]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=m));)g.lastIndex===l.index&&g.lastIndex++;return p===n.length?!u&&g.test("")||h.push(""):h.push(n.slice(p)),h.length>m?h.slice(0,m):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]});var on=le.f,an=function(e){return function(t){for(var n,i=ce(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)on.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},sn=an(!0);S(S.S,"Object",{entries:function(e){return sn(e)}});var ln=an(!1);S(S.S,"Object",{values:function(e){return ln(e)}}),at("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]});var cn,un,dn,hn=x("species"),fn=r.process,pn=r.setImmediate,mn=r.clearImmediate,gn=r.MessageChannel,yn=r.Dispatch,vn=0,bn={},kn=function(){var e=+this;if(bn.hasOwnProperty(e)){var t=bn[e];delete bn[e],t()}},wn=function(e){kn.call(e.data)};pn&&mn||(pn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return bn[++vn]=function(){!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])}e.apply(n,t)}("function"==typeof e?e:Function(e),t)},cn(vn),vn},mn=function(e){delete bn[e]},"process"==U(fn)?cn=function(e){fn.nextTick(i(kn,e,1))}:yn&&yn.now?cn=function(e){yn.now(i(kn,e,1))}:gn?(dn=(un=new gn).port2,un.port1.onmessage=wn,cn=i(dn.postMessage,dn,1)):r.addEventListener&&"function"==typeof postMessage&&!r.importScripts?(cn=function(e){r.postMessage(e+"","*")},r.addEventListener("message",wn,!1)):cn="onreadystatechange"in h("script")?function(e){Re.appendChild(h("script")).onreadystatechange=function(){Re.removeChild(this),kn.call(e)}}:function(e){setTimeout(i(kn,e,1),0)});var Tn={set:pn,clear:mn},En=Tn.set,An=r.MutationObserver||r.WebKitMutationObserver,_n=r.process,Sn=r.Promise,Pn="process"==U(_n);function Cn(e){var t,i;this.promise=new e(function(e,n){if(void 0!==t||void 0!==i)throw TypeError("Bad Promise constructor");t=e,i=n}),this.resolve=n(t),this.reject=n(i)}var Ln,Mn,Nn,xn,On={f:function(e){return new Cn(e)}},jn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},In=r.navigator,Rn=In&&In.userAgent||"",Fn=x("species"),qn=function(e){var t=r[e];c&&t&&!t[Fn]&&g.f(t,Fn,{configurable:!0,get:function(){return this}})},Dn=Tn.set,Vn=function(){var e,t,n,i=function(){var i,r;for(Pn&&(i=_n.domain)&&i.exit();e;){r=e.fn,e=e.next;try{r()}catch(i){throw e?n():t=void 0,i}}t=void 0,i&&i.enter()};if(Pn)n=function(){_n.nextTick(i)};else if(!An||r.navigator&&r.navigator.standalone)if(Sn&&Sn.resolve){var o=Sn.resolve(void 0);n=function(){o.then(i)}}else n=function(){En.call(r,i)};else{var a=!0,s=document.createTextNode("");new An(i).observe(s,{characterData:!0}),n=function(){s.data=a=!a}}return function(i){var r={fn:i,next:void 0};t&&(t.next=r),e||(e=r,n()),t=r}}(),Bn=r.TypeError,Hn=r.process,Un=Hn&&Hn.versions,Wn=Un&&Un.v8||"",zn=r.Promise,Kn="process"==K(Hn),Yn=function(){},Gn=Mn=On.f,$n=!!function(){try{var e=zn.resolve(1),t=(e.constructor={})[x("species")]=function(e){e(Yn,Yn)};return(Kn||"function"==typeof PromiseRejectionEvent)&&e.then(Yn)instanceof t&&0!==Wn.indexOf("6.6")&&-1===Rn.indexOf("Chrome/66")}catch(e){}}(),Jn=function(e){var t;return!(!a(e)||"function"!=typeof(t=e.then))&&t},Qn=function(e,t){if(!e._n){e._n=!0;var n=e._c;Vn(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a,s=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{s?(r||(2==e._h&&ei(e),e._h=1),!0===s?n=i:(u&&u.enter(),n=s(i),u&&(u.exit(),a=!0)),n===t.promise?c(Bn("Promise-chain cycle")):(o=Jn(n))?o.call(n,l,c):l(n)):c(i)}catch(e){u&&!a&&u.exit(),c(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&Xn(e)})}},Xn=function(e){Dn.call(r,function(){var t,n,i,o=e._v,a=Zn(e);if(a&&(t=jn(function(){Kn?Hn.emit("unhandledRejection",o,e):(n=r.onunhandledrejection)?n({promise:e,reason:o}):(i=r.console)&&i.error&&i.error("Unhandled promise rejection",o)}),e._h=Kn||Zn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Zn=function(e){return 1!==e._h&&0===(e._a||e._c).length},ei=function(e){Dn.call(r,function(){var t;Kn?Hn.emit("rejectionHandled",e):(t=r.onrejectionhandled)&&t({promise:e,reason:e._v})})},ti=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()),Qn(t,!0))},ni=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Bn("Promise can't be resolved itself");(t=Jn(e))?Vn(function(){var r={_w:n,_d:!1};try{t.call(e,i(ni,r,1),i(ti,r,1))}catch(e){ti.call(r,e)}}):(n._v=e,n._s=1,Qn(n,!1))}catch(e){ti.call({_w:n,_d:!1},e)}}};$n||(zn=function(e){Bt(this,zn,"Promise","_h"),n(e),Ln.call(this);try{e(i(ni,this,1),i(ti,this,1))}catch(e){ti.call(this,e)}},(Ln=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=Vt(zn.prototype,{then:function(e,t){var i,r,o,a=Gn((i=zn,void 0===(o=s(this).constructor)||null==(r=s(o)[hn])?i:n(r)));return a.ok="function"!=typeof e||e,a.fail="function"==typeof t&&t,a.domain=Kn?Hn.domain:void 0,this._c.push(a),this._a&&this._a.push(a),this._s&&Qn(this,!1),a.promise},catch:function(e){return this.then(void 0,e)}}),Nn=function(){var e=new Ln;this.promise=e,this.resolve=i(ni,e,1),this.reject=i(ti,e,1)},On.f=Gn=function(e){return e===zn||e===xn?new Nn(e):Mn(e)}),S(S.G+S.W+S.F*!$n,{Promise:zn}),ft(zn,"Promise"),qn("Promise"),xn=o.Promise,S(S.S+S.F*!$n,"Promise",{reject:function(e){var t=Gn(this);return(0,t.reject)(e),t.promise}}),S(S.S+S.F*!$n,"Promise",{resolve:function(e){return function(e,t){if(s(e),a(t)&&t.constructor===e)return t;var n=On.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),S(S.S+S.F*!($n&&Q(function(e){zn.all(e).catch(Yn)})),"Promise",{all:function(e){var t=this,n=Gn(t),i=n.resolve,r=n.reject,o=jn(function(){var n=[],o=0,a=1;Ht(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=Gn(t),i=n.reject,r=jn(function(){Ht(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var ii="".startsWith;S(S.P+S.F*rt("startsWith"),"String",{startsWith:function(e){var t=nt(this,e,"startsWith"),n=V(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return ii?ii.call(t,i,n):t.slice(n,n+i.length)===i}}),S(S.S,"Number",{isNaN:function(e){return e!=e}});var ri=function(e){return null!=e?e.constructor:null},oi=function(e,t){return Boolean(e&&t&&e instanceof t)},ai=function(e){return null==e},si=function(e){return ri(e)===Object},li=function(e){return ri(e)===String},ci=function(e){return Array.isArray(e)},ui=function(e){return oi(e,NodeList)},di=function(e){return ai(e)||(li(e)||ci(e)||ui(e))&&!e.length||si(e)&&!Object.keys(e).length},hi={nullOrUndefined:ai,object:si,number:function(e){return ri(e)===Number&&!Number.isNaN(e)},string:li,boolean:function(e){return ri(e)===Boolean},function:function(e){return ri(e)===Function},array:ci,weakMap:function(e){return oi(e,WeakMap)},nodeList:ui,element:function(e){return oi(e,Element)},textNode:function(e){return ri(e)===Text},event:function(e){return oi(e,Event)},keyboardEvent:function(e){return oi(e,KeyboardEvent)},cue:function(e){return oi(e,window.TextTrackCue)||oi(e,window.VTTCue)},track:function(e){return oi(e,TextTrack)||!ai(e)&&li(e.kind)},url:function(e){if(oi(e,window.URL))return!0;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!di(new URL(t).hostname)}catch(e){return!1}},empty:di},fi=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 pi(e,t,n){var i=this,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!hi.empty(t)&&hi.function(n)){var s=t.split(" "),l=a;fi&&(l={passive:o,capture:a}),s.forEach(function(t){i&&i.eventListeners&&r&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[r?"addEventListener":"removeEventListener"](t,n,l)})}}function mi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!0,i,r)}function gi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!1,i,r)}function yi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,function o(){gi(e,t,o,i,r);for(var a=arguments.length,s=new Array(a),l=0;l<a;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r)}function vi(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(hi.element(e)&&!hi.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}function bi(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 ki(e,t){hi.element(e)&&!hi.empty(t)&&Object.entries(t).filter(function(e){var t=nn(e,2)[1];return!hi.nullOrUndefined(t)}).forEach(function(t){var n=nn(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function wi(e,t,n){var i=document.createElement(e);return hi.object(t)&&ki(i,t),hi.string(n)&&(i.innerText=n),i}function Ti(e,t,n,i){hi.element(t)&&t.appendChild(wi(e,n,i))}function Ei(e){hi.nodeList(e)||hi.array(e)?Array.from(e).forEach(Ei):hi.element(e)&&hi.element(e.parentNode)&&e.parentNode.removeChild(e)}function Ai(e){if(hi.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function _i(e,t){return hi.element(t)&&hi.element(t.parentNode)&&hi.element(e)?(t.parentNode.replaceChild(e,t),e):null}function Si(e,t){if(!hi.string(e)||hi.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".":hi.object(i)&&hi.string(i.class)&&(i.class+=" ".concat(r)),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function Pi(e,t){if(hi.element(e)){var n=t;hi.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function Ci(e,t,n){if(hi.nodeList(e))return Array.from(e).map(function(e){return Ci(e,t,n)});if(hi.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function Li(e,t){return hi.element(e)&&e.classList.contains(t)}function Mi(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 Ni(e){return this.elements.container.querySelectorAll(e)}function xi(e){return this.elements.container.querySelector(e)}function Oi(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];hi.element(e)&&(e.focus(),t&&Ci(e,this.config.classNames.tabFocus))}var ji,Ii,Ri,Fi=(ji=document.createElement("span"),Ii={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},Ri=Object.keys(Ii).find(function(e){return void 0!==ji.style[e]}),!!hi.string(Ri)&&Ii[Ri]);function qi(e){setTimeout(function(){try{Pi(e,!0),e.offsetHeight,Pi(e,!1)}catch(e){}},0)}var Di,Vi={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)},Bi={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Hi={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=Vi.isIPhone&&n&&Hi.playsinline,r=Hi[e]||"html5"!==t;return{api:r,ui:r&&Hi.rangeInput&&("video"!==e||!Vi.isIPhone||i)}},pip:!Vi.isIPhone&&hi.function(wi("video").webkitSetPresentationMode),airplay:hi.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=nn(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in Bi&&(t="".concat(e,'; codecs="').concat(Bi[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Di=document.createElement("input"),Di.type="range","range"===Di.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Fi,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Ui={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return Hi.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return Ui.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=Ui.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=Ui.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",function(){e.currentTime=r,o||e.play()}),e.media.load()),vi.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Ei(Ui.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Wi(e){return hi.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function zi(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function Ki(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new 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 hi.object(r)?(Object.keys(r).forEach(function(t){hi.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,tn({},t,{})),Ki(e[t],r[t])):Object.assign(e,tn({},t,r[t]))}),Ki.apply(void 0,[e].concat(n))):e}var Yi=g.f,Gi=_e.f,$i=r.RegExp,Ji=$i,Qi=$i.prototype,Xi=/a/g,Zi=/a/g,er=new $i(Xi)!==Xi;if(c&&(!er||l(function(){return Zi[x("match")]=!1,$i(Xi)!=Xi||$i(Zi)==Zi||"/a/i"!=$i(Xi,"i")}))){$i=function(e,t){var n=this instanceof $i,i=tt(e),r=void 0===t;return!n&&i&&e.constructor===$i&&r?e:pe(er?new Ji(i&&!r?e.source:e,t):Ji((i=e instanceof $i)?e.source:e,i&&r?st.call(e):t),n?this:Qi,$i)};for(var tr=function(e){e in $i||Yi($i,e,{configurable:!0,get:function(){return Ji[e]},set:function(t){Ji[e]=t}})},nr=Gi(Ji),ir=0;nr.length>ir;)tr(nr[ir++]);Qi.constructor=$i,$i.prototype=Qi,A(r,"RegExp",$i)}function rr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return hi.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function or(){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 ar(){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 sr(){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=or(e,"-"," "),e=or(e,"_"," "),or(e=ar(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function lr(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}qn("RegExp");var cr=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(hi.empty(e)||hi.empty(t))return"";var n=zi(t.i18n,e);if(hi.empty(n))return"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=nn(e,2),i=t[0],r=t[1];n=or(n,i,r)}),n},ur=function(){function e(t){Xt(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return en(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(hi.empty(n))return null;var i=JSON.parse(n);return hi.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&hi.object(t)){var n=this.get();hi.empty(n)&&(n={}),Ki(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 dr(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.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function hr(e,t){if(hi.string(e)){var n=hi.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=ur.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==s){var l=JSON.parse(s);r(a,l.content)}}dr(e).then(function(e){hi.empty(e)||(o&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}var fr=function(e){return parseInt(e/60/60%60,10)},pr=function(e){return parseInt(e/60%60,10)},mr=function(e){return parseInt(e%60,10)};function gr(){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(!hi.number(e))return gr(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=fr(e),o=pr(e),a=mr(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(a))}var yr={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Vi.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=xi.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Ni.call(this,this.config.selectors.buttons.play),pause:xi.call(this,this.config.selectors.buttons.pause),restart:xi.call(this,this.config.selectors.buttons.restart),rewind:xi.call(this,this.config.selectors.buttons.rewind),fastForward:xi.call(this,this.config.selectors.buttons.fastForward),mute:xi.call(this,this.config.selectors.buttons.mute),pip:xi.call(this,this.config.selectors.buttons.pip),airplay:xi.call(this,this.config.selectors.buttons.airplay),settings:xi.call(this,this.config.selectors.buttons.settings),captions:xi.call(this,this.config.selectors.buttons.captions),fullscreen:xi.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=xi.call(this,this.config.selectors.progress),this.elements.inputs={seek:xi.call(this,this.config.selectors.inputs.seek),volume:xi.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:xi.call(this,this.config.selectors.display.buffer),currentTime:xi.call(this,this.config.selectors.display.currentTime),duration:xi.call(this,this.config.selectors.display.duration)},hi.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(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=yr.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),r=document.createElementNS("http://www.w3.org/2000/svg","svg");ki(r,Ki(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a="".concat(i,"-").concat(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){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={pip:"PIP",airplay:"AirPlay"}[e]||cr(e,this.config);return wi("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(hi.empty(e))return null;var t=wi("span",{class:this.config.classNames.menu.value});return t.appendChild(wi("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n,i,r,o,a=wi("button"),s=Object.assign({},t),l=sr(e),c=!1;switch("type"in s||(s.type="button"),"class"in s?s.class.includes(this.config.classNames.control)||(s.class+=" ".concat(this.config.classNames.control)):s.class=this.config.classNames.control,e){case"play":c=!0,n="play",r="pause",i="play",o="pause";break;case"mute":c=!0,n="mute",r="unmute",i="volume",o="muted";break;case"captions":c=!0,n="enableCaptions",r="disableCaptions",i="captions-off",o="captions-on";break;case"fullscreen":c=!0,n="enterFullscreen",r="exitFullscreen",i="enter-fullscreen",o="exit-fullscreen";break;case"play-large":s.class+=" ".concat(this.config.classNames.control,"--overlaid"),l="play",n="play",i="play";break;default:n=l,i=e}return c?(a.appendChild(yr.createIcon.call(this,o,{class:"icon--pressed"})),a.appendChild(yr.createIcon.call(this,i,{class:"icon--not-pressed"})),a.appendChild(yr.createLabel.call(this,r,{class:"label--pressed"})),a.appendChild(yr.createLabel.call(this,n,{class:"label--not-pressed"}))):(a.appendChild(yr.createIcon.call(this,i)),a.appendChild(yr.createLabel.call(this,n))),Ki(s,Si(this.config.selectors.buttons[l],s)),ki(a,s),"play"===l?(hi.array(this.elements.buttons[l])||(this.elements.buttons[l]=[]),this.elements.buttons[l].push(a)):this.elements.buttons[l]=a,a},createRange:function(e,t){var n=wi("input",Ki(Si(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":cr(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,yr.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=wi("progress",Ki(Si(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(wi("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?cr(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=Si(this.config.selectors.display[e]),n=wi("div",Ki(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":cr(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;mi(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=Mi(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))yr.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,hi.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,hi.element(r)||(r=e.parentNode.lastElementChild)),Oi.call(n,r,!0))}},!1),mi(e,"keyup",function(e){13===e.which&&yr.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=Si(this.config.selectors.inputs[r]),d=wi("button",Ki(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=wi("span");h.innerHTML=o,hi.element(s)&&h.appendChild(s),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return Mi(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!hi.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}yr.showMenuPanel.call(t,"home",hi.keyboardEvent(e))}},r,!1),yr.bindMenuItemShortcuts.call(this,d,r),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return hi.number(e)?gr(e,fr(this.duration)>0,t):e},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];hi.element(e)&&hi.number(t)&&(e.innerText=yr.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(hi.element(this.elements.inputs.volume)&&yr.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),hi.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;hi.element(e)&&(e.value=t,yr.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&hi.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&&yr.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=hi.number(n)?n:0,r=hi.element(e)?e:t.elements.display.buffer;if(hi.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];hi.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=hi.event(e)?e.target:e;if(hi.element(t)&&"range"===t.getAttribute("type")){if(Mi(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=yr.formatTime(this.currentTime),i=yr.formatTime(this.duration),r=cr("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(Mi(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext","".concat(o.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);Vi.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&hi.element(this.elements.inputs.seek)&&hi.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r="".concat(this.config.classNames.tooltip,"--visible"),o=function(e){Ci(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(hi.event(e))n=100/i.width*(e.pageX-i.left);else{if(!Li(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),yr.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),hi.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!hi.element(this.elements.display.duration)&&this.config.invertTime;yr.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||yr.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return Pi(this.elements.display.currentTime,!0),void Pi(this.elements.progress,!0);hi.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=hi.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&yr.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&yr.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),yr.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){Pi(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=hi.empty(n)?this[e]:n,hi.empty(r)&&(r=this.config[e].default),!hi.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '".concat(r,"' for ").concat(e));if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '".concat(r,"' for ").concat(e))}if(hi.element(o)||(o=i&&i.querySelector('[role="menu"]')),hi.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=yr.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'.concat(r,'"]'));hi.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?cr("normal",this.config):"".concat(t,"×");case"quality":if(hi.number(t)){var n=cr("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return ar(t);case"captions":return kr.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');hi.array(e)&&(this.options.quality=Wi(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!hi.empty(this.options.quality)&&this.options.quality.length>1;if(yr.toggleMenuButton.call(this,"quality",i),Ai(n),yr.checkMenu.call(this),i){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){yr.createMenuItem.call(t,{value:e,list:n,type:"quality",title:yr.getLabel.call(t,"quality",e),badge:function(e){var n=cr("qualityBadge.".concat(e),t.config);return n.length?yr.createBadge.call(t,n):null}(e)})}),yr.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(hi.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=kr.getTracks.call(this),i=Boolean(n.length);if(yr.toggleMenuButton.call(this,"captions",i),Ai(t),yr.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:kr.getLabel.call(e,n),badge:n.language&&yr.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:cr("disabled",this.config),list:t,type:"language"}),r.forEach(yr.createMenuItem.bind(this)),yr.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');hi.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 i=!hi.empty(this.options.speed)&&this.options.speed.length>1;yr.toggleMenuButton.call(this,"speed",i),Ai(n),yr.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){yr.createMenuItem.call(t,{value:e,list:n,type:"speed",title:yr.getLabel.call(t,"speed",e)})}),yr.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!hi.empty(e)&&Object.values(e).some(function(e){return!e.hidden});Pi(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;hi.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');Oi.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(hi.element(t)&&hi.element(n)){var i=t.hidden,r=i;if(hi.boolean(e))r=e;else if(hi.keyboardEvent(e)&&27===e.which)r=!1;else if(hi.event(e)){var o=t.contains(e.target);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),Pi(t,!r),Ci(this.elements.container,this.config.classNames.menu.open,r),r&&hi.keyboardEvent(e)?yr.focusFirstMenuItem.call(this,null,!0):r||i||Oi.call(this,n,hi.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return Ei(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(hi.element(i)){var r=i.parentNode,o=Array.from(r.children).find(function(e){return!e.hidden});if(Hi.transitions&&!Hi.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var a=yr.getMenuSize.call(this,i);mi.call(this,r,Fi,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",gi.call(e,r,Fi,t))}),r.style.width="".concat(a.width,"px"),r.style.height="".concat(a.height,"px")}Pi(o,!0),Pi(i,!1),yr.focusFirstMenuItem.call(this,i,n)}},create:function(e){var t=this,n=wi("div",Si(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(yr.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(yr.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(yr.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(yr.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=wi("div",Si(this.config.selectors.progress));if(i.appendChild(yr.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(yr.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=wi("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(yr.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(yr.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var o=wi("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&o.appendChild(yr.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a={max:1,step:.05,value:this.config.volume};o.appendChild(yr.createRange.call(this,"volume",Ki(a,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=o}n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(yr.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!hi.empty(this.config.settings)){var s=wi("div",{class:"plyr__menu",hidden:""});s.appendChild(yr.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=wi("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=wi("div"),u=wi("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=wi("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=wi("button",Ki(Si(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));yr.bindMenuItemShortcuts.call(t,i,n),mi(i,"click",function(){yr.showMenuPanel.call(t,n,!1)});var r=wi("span",null,cr(n,t.config)),o=wi("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),d.appendChild(i);var a=wi("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),s=wi("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});s.appendChild(wi("span",{"aria-hidden":!0},cr(n,t.config))),s.appendChild(wi("span",{class:t.config.classNames.hidden},cr("menuBack",t.config))),mi(a,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),yr.showMenuPanel.call(t,"home",!0))},!1),mi(s,"click",function(){yr.showMenuPanel.call(t,"home",!1)}),a.appendChild(s),a.appendChild(wi("div",{role:"menu"})),c.appendChild(a),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=a}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.popup=l,this.elements.settings.menu=s}return this.config.controls.includes("pip")&&Hi.pip&&n.appendChild(yr.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Hi.airplay&&n.appendChild(yr.createButton.call(this,"airplay")),this.config.controls.includes("fullscreen")&&n.appendChild(yr.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(yr.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&yr.setQualityMenu.call(this,Ui.getQualityOptions.call(this)),yr.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=yr.getIconUrl.call(this);t.cors&&hr(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;hi.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),hi.element(this.config.controls)||hi.string(this.config.controls)?n=this.config.controls:(n=yr.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:kr.getLabel.call(this)}),r=!1);var o,a=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t=or(t,"{".concat(i,"}"),r)}),t};if(r&&(hi.string(this.config.controls)?n=a(n):hi.element(n)&&(n.innerHTML=a(n.innerHTML))),hi.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),hi.element(o)||(o=this.elements.container),o[hi.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),hi.element(this.elements.controls)||yr.findElements.call(this),!hi.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return Li(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Ci(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){hi.array(e)||hi.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)})}if(window.navigator.userAgent.includes("Edge")&&qi(o),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,d="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),h=Ni.call(this,d);Array.from(h).forEach(function(t){Ci(t,e.config.classNames.hidden,!1),Ci(t,e.config.classNames.tooltip,!0)})}}};function vr(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 br(e){var t=new URLSearchParams;return hi.object(e)&&Object.entries(e).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var kr={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Hi.textTracks)hi.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&yr.setCaptionsMenu.call(this);else{var e,t;if(hi.element(this.elements.captions)||(this.elements.captions=wi("div",Si(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,hi.element(e)&&hi.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Vi.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=vr(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&dr(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){Ei(e)})})}var i=Wi((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=nn(i,1)[0];var o=this.storage.get("captions");if(hi.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:r,languages:i}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";mi.call(this,this.media.textTracks,a,kr.update.bind(this))}setTimeout(kr.update.bind(this),0)}},update:function(){var e=this,t=kr.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",mi.call(e,t,"cuechange",function(){return kr.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(a))&&(kr.setLanguage.call(this,r),kr.toggle.call(this,i&&s)),Ci(this.elements.container,this.config.classNames.captions.enabled,!hi.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&yr.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=hi.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=kr.getTracks.call(this),a=kr.findTrack.call(this,[this.captions.language].concat(rn(this.captions.languages)),!0);return this.captions.language=a.language,void kr.set.call(this,o.indexOf(a))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),Ci(this.elements.container,i,r),this.captions.toggled=r,yr.updateSetting.call(this,"captions"),vi.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=kr.getTracks.call(this);if(-1!==e)if(hi.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,yr.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),vi.call(this,this.media,"languagechange")}kr.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&kr.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else kr.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(hi.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=kr.getTracks.call(this),r=kr.findTrack.call(this,[n]);kr.set.call(this,i.indexOf(r),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)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=kr.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(r).sort(function(e,t){return o(t)-o(e)});return e.every(function(e){return!(t=a.find(function(t){return t.language===e}))}),t||(i?a[0]:void 0)},getCurrentTrack:function(){return kr.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!hi.track(t)&&Hi.textTracks&&this.captions.toggled&&(t=kr.getCurrentTrack.call(this)),hi.track(t)?hi.empty(t.label)?hi.empty(t.language)?cr("enabled",this.config):e.language.toUpperCase():t.label:cr("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(hi.element(this.elements.captions))if(hi.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=kr.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(lr)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){Ai(this.elements.captions);var r=wi("span",Si(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),vi.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},wr={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!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]},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",seekLabel:"{currentTime} of {duration}",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",menuBack:"Go back to previous menu",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","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",controlPressed:"plyr__control--pressed",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",display:{time:"plyr__time"},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:""}},Tr={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Er={audio:"audio",video:"video"};var Ar=function(){},_r=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xt(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return en(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Ar}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Ar}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Ar}}]),e}();function Sr(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;hi.element(e)&&(e.pressed=this.active),vi.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Vi.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(hi.element(e)){var n=Ni.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];pi.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Pr(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",Ci(this.target,this.player.config.classNames.fullscreen.fallback,t),Vi.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var r=hi.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!r,r||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return qi(e.target)},100)}Sr.call(this)}var Cr=function(){function e(t){var n=this;Xt(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},mi.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){Sr.call(n)}),mi.call(this.player,this.player.elements.container,"dblclick",function(e){hi.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return en(e,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(e.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),Ci(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Vi.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():e.native?this.prefix?hi.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():Pr.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(Vi.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!hi.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else Pr.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["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:Li(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return Vi.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(hi.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!hi.function(document["".concat(t,"ExitFullscreen")])&&!hi.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),Lr=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function Mr(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})})}S(S.S,"Math",{sign:Lr});var Nr={addStyleHook:function(){Ci(this.elements.container,this.config.selectors.container.replace(".",""),!0),Ci(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 ".concat(this.provider," ").concat(this.type)),void Nr.toggleNativeControls.call(this,!0);hi.element(this.elements.controls)||(yr.inject.call(this),this.listeners.controls()),Nr.toggleNativeControls.call(this),this.isHTML5&&kr.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,yr.updateVolume.call(this),yr.timeUpdate.call(this),Nr.checkPlaying.call(this),Ci(this.elements.container,this.config.classNames.pip.supported,Hi.pip&&this.isHTML5&&this.isVideo),Ci(this.elements.container,this.config.classNames.airplay.supported,Hi.airplay&&this.isHTML5),Ci(this.elements.container,this.config.classNames.isIos,Vi.isIos),Ci(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){vi.call(e,e.media,"ready")},0),Nr.setTitle.call(this),this.poster&&Nr.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&yr.durationUpdate.call(this)},setTitle:function(){var e=cr("play",this.config);if(hi.string(this.config.title)&&!hi.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=xi.call(this,"iframe");if(!hi.element(t))return;var n=hi.empty(this.config.title)?"video":this.config.title,i=cr("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){Ci(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):mi.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return Mr(e)}).catch(function(n){throw e===t.poster&&Nr.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),Nr.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;Ci(this.elements.container,this.config.classNames.playing,this.playing),Ci(this.elements.container,this.config.classNames.paused,this.paused),Ci(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),hi.event(e)&&"timeupdate"===e.type||Nr.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(){Ci(t.elements.container,t.config.classNames.loading,t.loading),Nr.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))}},xr=function(){function e(t){Xt(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return en(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,o=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&hi.number(i)){if(r){var a=document.activeElement;if(hi.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&Mi(a,s))return;if(32===e.which&&Mi(a,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:o||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:o||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:o||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:o||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){yr.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,Ci(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,Ci(Ni.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&Ci(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&pi.call(t,window,"keydown keyup",this.handleKey,e,!1),pi.call(t,document.body,"click",this.toggleMenu,e),yi.call(t,document.body,"touchstart",this.firstTouch),pi.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&mi.call(e,t.container,"keydown keyup",this.handleKey,!1),mi.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var r=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(Nr.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return Nr.toggleControls.call(e,!1)},r)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(mi.call(e,e.media,"timeupdate seeking seeked",function(t){return yr.timeUpdate.call(e,t)}),mi.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return yr.durationUpdate.call(e,t)}),mi.call(e,e.media,"canplay",function(){Pi(t.volume,!e.hasAudio),Pi(t.buttons.mute,!e.hasAudio)}),mi.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),mi.call(e,e.media,"progress playing seeking seeked",function(t){return yr.updateProgress.call(e,t)}),mi.call(e,e.media,"volumechange",function(t){return yr.updateVolume.call(e,t)}),mi.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return Nr.checkPlaying.call(e,t)}),mi.call(e,e.media,"waiting canplay seeked playing",function(t){return Nr.checkLoading.call(e,t)}),mi.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=xi.call(e,".".concat(e.config.classNames.video));if(!hi.element(n))return;mi.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&mi.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),mi.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),mi.call(e,e.media,"ratechange",function(){yr.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),mi.call(e,e.media,"qualitychange",function(t){yr.updateSetting.call(e,"quality",null,t.detail.quality)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");mi.call(e,e.media,i,function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),vi.call(e,t.container,n.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;hi.function(r)&&(o=r.call(i,e)),o&&hi.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[i],l=hi.function(s);mi.call(a,e,t,function(e){return r.proxy(e,n,i)},o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=Vi.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),yr.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),yr.toggleMenu.call(t,e)):yr.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&yr.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!hi.keyboardEvent(e)||39===i||37===i){var r=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(e.type);r&&o?(n.removeAttribute("play-on-seeked"),t.play()):!o&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),Vi.isIos){var r=Ni.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return qi(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");hi.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return yr.updateSeekTooltip.call(t,e)}),Vi.isWebkit&&Array.from(Ni.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return yr.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!hi.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,yr.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin focusout",function(n){var i=t.config,r=t.elements,o=t.timers,a="focusin"===n.type;if(Ci(r.controls,i.classNames.noTransition,a),Nr.toggleControls.call(t,a),a){setTimeout(function(){Ci(r.controls,i.classNames.noTransition,!1)},0);var s=e.touch?3e3:4e3;clearTimeout(o.controls),o.controls=setTimeout(function(){return Nr.toggleControls.call(t,!1)},s)}}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=nn([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),r=i[0],o=i[1],a=Math.sign(Math.abs(r)>Math.abs(o)?r:o);t.increaseVolume(a/50);var s=t.media.volume;(1===a&&s<1||-1===a&&s>0)&&e.preventDefault()},"volume",!1)}}]),e}(),Or=g.f,jr=Function.prototype,Ir=/^\s*function ([^ (]*)/;"name"in jr||c&&Or(jr,"name",{configurable:!0,get:function(){try{return(""+this).match(Ir)[1]}catch(e){return""}}}),at("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]});var Rr=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,d=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!==d(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 Fr(e){return new Promise(function(t,n){Rr(e,{success:t,error:n})})}function qr(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Dr={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Dr.setAspectRatio.call(this),hi.object(window.Vimeo)?Dr.ready.call(this):Fr(this.config.urls.vimeo.sdk).then(function(){Dr.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=nn((hi.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=br({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");hi.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,hi.empty(r)?null:hi.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=wi("iframe"),s=rr(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=wi("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(a),t.media=_i(l,t.media),dr(rr(t.config.urls.vimeo.api,o),"json").then(function(e){if(!hi.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),Nr.setPoster.call(t,n.href).catch(function(){})}}),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 qr.call(t,!0),t.embed.play()},t.media.pause=function(){return qr.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,vi.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,vi.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&yr.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,vi.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!hi.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,vi.call(t,t.media,"volumechange")})}});var f,p=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return p},set:function(e){var n=hi.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){p=n})}}),t.embed.getVideoUrl().then(function(e){f=e}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return f}}),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"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Dr.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,Nr.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,vi.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,vi.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,kr.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});kr.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){qr.call(t,!e),e||vi.call(t,t.media,"playing")}),hi.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){qr.call(t,!0),vi.call(t,t.media,"playing")}),t.embed.on("pause",function(){qr.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,vi.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,vi.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&vi.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,vi.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,vi.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,vi.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,vi.call(t,t.media,"error")}),setTimeout(function(){return Nr.build.call(t)},0)}};function Vr(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Br,Hr={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Hr.setAspectRatio.call(this),hi.object(window.YT)&&hi.function(window.YT.Player)?Hr.ready.call(this):(Fr(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(){Hr.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(hi.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(hi.empty(n))return this.config.title=n,void Nr.setTitle.call(this)}var i=this.config.keys.google;hi.string(i)&&!hi.empty(i)&&dr(rr(this.config.urls.youtube.api,e,i)).then(function(e){hi.object(e)&&(t.config.title=e.items[0].snippet.title,Nr.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(hi.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");hi.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r,o=(i=n,hi.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),a=(r=e.provider,"".concat(r,"-").concat(Math.floor(1e4*Math.random()))),s=wi("div",{id:a,poster:e.poster});e.media=_i(s,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(o,"/").concat(e,"default.jpg")};Mr(l("maxres"),121).catch(function(){return Mr(l("sd"),121)}).catch(function(){return Mr(l("hq"))}).then(function(t){return Nr.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(a,{videoId:o,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,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(!e.media.error){var n=t.data,i={2:"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.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},vi.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),vi.call(e,e.media,"ratechange")},onReady:function(t){if(!hi.function(e.media.play)){var n=t.target;Hr.getTitle.call(e,o),e.media.play=function(){Vr.call(e,!0),n.playVideo()},e.media.pause=function(){Vr.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.hasPlayed&&e.embed.mute(),e.media.seeking=!0,vi.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),vi.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var i=hi.boolean(t)?t:r;r=i,n[i?"mute":"unMute"](),vi.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),vi.call(e,e.media,"timeupdate"),vi.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)&&vi.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),vi.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return Nr.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,vi.call(e,e.media,"seeked")),t.data){case-1:vi.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),vi.call(e,e.media,"progress");break;case 0:Vr.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):vi.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Vr.call(e,!0),vi.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){vi.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),vi.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Vr.call(e,!1)}vi.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Ur={setup:function(){this.media?(Ci(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),Ci(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&Ci(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=wi("div",{class:this.config.classNames.video}),bi(this.media,this.elements.wrapper),this.elements.poster=wi("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ui.extend.call(this):this.isYouTube?Hr.setup.call(this):this.isVimeo&&Dr.setup.call(this)):this.debug.warn("No media element found!")}},Wr=function(){function e(t){var n=this;Xt(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 en(e,[{key:"load",value:function(){var e=this;this.enabled&&(hi.object(window.google)&&hi.object(window.google.ima)?this.ready():Fr(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=wi("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=gr(Math.max(e.manager.getRemainingTime(),0)),n="".concat(cr("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),hi.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(hi.element(n)){var i=100/t.player.duration*e,r=wi("span",{class:t.player.config.classNames.cues});r.style.left="".concat(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".concat(e.replace(/_/g,"").toLowerCase());vi.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,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;hi.empty(t.cuePoints)||t.cuePoints.forEach(function(i,r){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.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=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];hi.array(o)&&o.forEach(function(e){hi.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return hi.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: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){hi.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!hi.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(br(e))}}]),e}(),zr={insertElements:function(e,t){var n=this;hi.string(t)?Ti(e,this.media,{src:t}):hi.array(t)&&t.forEach(function(t){Ti(e,n.media,t)})},change:function(e){var t=this;zi(e,"sources.length")?(Ui.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],Ei(t.media),t.media=null,hi.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=nn(n,1)[0],o=r.provider,a=void 0===o?Tr.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:Hi.check(i,a,t.config.playsinline),media:wi(l,c)}),t.elements.container.appendChild(t.media),hi.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),hi.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","")),Nr.addStyleHook.call(t),t.isHTML5&&zr.insertElements.call(t,"source",n),t.config.title=e.title,Ur.setup.call(t),t.isHTML5&&("tracks"in e&&zr.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&Nr.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Kr=function(){function e(t,n){var i=this;if(Xt(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Hi.touch,this.media=t,hi.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||hi.nodeList(this.media)||hi.array(this.media))&&(this.media=this.media[0]),this.config=Ki({},wr,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new _r(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Hi),!hi.nullOrUndefined(this.media)&&hi.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Hi.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"),hi.element(a)){if(s=vr(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Tr.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Tr.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.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.hl=s.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(hi.empty(this.provider)||!Object.keys(Tr).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Er.video;break;case"video":case"audio":this.type=o,this.provider=Tr.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-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=Hi.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new xr(this),this.storage=new ur(this),this.media.plyr=this,hi.element(this.elements.container)||(this.elements.container=wi("div"),bi(this.media,this.elements.container)),Nr.addStyleHook.call(this),Ur.setup.call(this),this.config.debug&&mi.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&Nr.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Cr(this),this.config.ads.enabled&&(this.ads=new Wr(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 en(e,[{key:"play",value:function(){return hi.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&hi.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(hi.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):hi.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(hi.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(hi.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(hi.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){kr.toggle.call(this,e,!1)}},{key:"airplay",value:function(){Hi.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=Li(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=Ci(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!hi.empty(this.config.settings)&&yr.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";vi.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){mi.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){yi.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){gi(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&&(Ei(t.elements.buttons.play),Ei(t.elements.captions),Ei(t.elements.controls),Ei(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),hi.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),_i(t.elements.original,t.elements.container),vi.call(t,t.elements.original,"destroyed",!0),hi.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),Nr.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&hi.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return Hi.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Tr.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Tr.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Tr.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Er.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Er.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=hi.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return hi.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,n=hi.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;hi.string(t)&&(t=Number(t)),hi.number(t)||(t=this.storage.get("volume")),hi.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!hi.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;hi.boolean(t)||(t=this.storage.get("muted")),hi.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;hi.number(e)&&(t=e),hi.number(t)||(t=this.storage.get("speed")),hi.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 (".concat(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=[!hi.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(hi.number);if(!n.includes(i)){var r=function(e,t){return hi.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: ".concat(i,", using ").concat(r," instead")),i=r}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=hi.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){zr.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"poster",set:function(e){this.isVideo?Nr.setPoster.call(this,e,!1).catch(function(){}):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=hi.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){kr.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){kr.setLanguage.call(this,e,!1)},get:function(){return(kr.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Hi.pip){var i=hi.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Hi.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Hi.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return hr(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return hi.string(t)?i=Array.from(document.querySelectorAll(t)):hi.nodeList(t)?i=Array.from(t):hi.array(t)&&(i=t.filter(hi.element)),hi.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return Kr.defaults=(Br=wr,JSON.parse(JSON.stringify(Br))),Kr}); +"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";!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=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};t.prototype=window.Event.prototype,window.CustomEvent=t}}();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}!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",{writable:!0,value:{}}),"string"==typeof e)""!==e&&this._fromString(e);else if(e instanceof o){var t=this;e.forEach(function(e,n){t.append(n,e)})}},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.push(i(n)+"="+i(t))}),e.join("&")},Object.defineProperty(a,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){this._entries={};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]):"")}}),e.URLSearchParams=o}(),"function"!=typeof URLSearchParams.prototype.sort&&(URLSearchParams.prototype.sort=function(){var e=this,t=[];this.forEach(function(n,i){t.push([i,n]),e._entries||e.delete(i)}),t.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0}),e._entries&&(e._entries={});for(var n=0;n<t.length;n++)this.append(t[n][0],t[n][1])})}(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(t,n){"string"!=typeof t&&(t=String(t));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){(i=(r=document.implementation.createHTMLDocument("")).createElement("base")).href=n,r.head.appendChild(i);try{if(0!==i.href.indexOf(n))throw new Error(i.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=r.createElement("a");if(o.href=t,i&&(r.body.appendChild(o),o.href=o.href),":"===o.protocol||!/:/.test(o.href))throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var a=new URLSearchParams(this.search),s=!0,l=!0,c=this;["append","delete","set"].forEach(function(e){var t=a[e];a[e]=function(){t.apply(a,arguments),s&&(l=!1,c.search=a.toString(),l=!0)}}),Object.defineProperty(this,"searchParams",{value:a,enumerable:!0});var u=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==u&&(u=this.search,l&&(s=!1,this.searchParams._fromString(this.search),s=!0))}})},i=n.prototype;["hash","host","hostname","port","protocol"].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.defineProperty(i,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),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,this._updateSearchParams()},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}}),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 n=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},i=function(e,t,i){if(n(e),void 0===t)return e;switch(i){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)}},r=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)}),o=t(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),a=(o.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),s=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e},l=function(e){try{return!!e()}catch(e){return!0}},c=!l(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),u=r.document,d=a(u)&&a(u.createElement),h=function(e){return d?u.createElement(e):{}},f=!c&&!l(function(){return 7!=Object.defineProperty(h("div"),"a",{get:function(){return 7}}).a}),p=function(e,t){if(!a(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!a(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!a(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},m=Object.defineProperty,g={f:c?Object.defineProperty:function(e,t,n){if(s(e),t=p(t,!0),s(n),f)try{return m(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}},y=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},v=c?function(e,t,n){return g.f(e,t,y(1,n))}:function(e,t,n){return e[t]=n,e},b={}.hasOwnProperty,k=function(e,t){return b.call(e,t)},w=0,T=Math.random(),E=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++w+T).toString(36))},A=t(function(e){var t=E("src"),n=Function.toString,i=(""+n).split("toString");o.inspectSource=function(e){return n.call(e)},(e.exports=function(e,n,o,a){var s="function"==typeof o;s&&(k(o,"name")||v(o,"name",n)),e[n]!==o&&(s&&(k(o,t)||v(o,t,e[n]?""+e[n]:i.join(String(n)))),e===r?e[n]=o:a?e[n]?e[n]=o:v(e,n,o):(delete e[n],v(e,n,o)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[t]||n.call(this)})}),_=function(e,t,n){var a,s,l,c,u=e&_.F,d=e&_.G,h=e&_.S,f=e&_.P,p=e&_.B,m=d?r:h?r[t]||(r[t]={}):(r[t]||{}).prototype,g=d?o:o[t]||(o[t]={}),y=g.prototype||(g.prototype={});for(a in d&&(n=t),n)l=((s=!u&&m&&void 0!==m[a])?m:n)[a],c=p&&s?i(l,r):f&&"function"==typeof l?i(Function.call,l):l,m&&A(m,a,l,e&_.U),g[a]!=l&&v(g,a,c),f&&y[a]!=l&&(y[a]=l)};r.core=o,_.F=1,_.G=2,_.S=4,_.P=8,_.B=16,_.W=32,_.U=64,_.R=128;var S=_,P=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},C=function(e){return Object(P(e))},L=function(e,t,n,i){try{return i?t(s(n)[0],n[1]):t(n)}catch(t){var r=e.return;throw void 0!==r&&s(r.call(e)),t}},M={},N=t(function(e){var t=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,n){return t[e]||(t[e]=void 0!==n?n:{})})("versions",[]).push({version:o.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),x=t(function(e){var t=N("wks"),n=r.Symbol,i="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=i&&n[e]||(i?n:E)("Symbol."+e))}).store=t}),O=x("iterator"),j=Array.prototype,I=function(e){return void 0!==e&&(M.Array===e||j[O]===e)},R=Math.ceil,F=Math.floor,D=function(e){return isNaN(e=+e)?0:(e>0?F:R)(e)},q=Math.min,V=function(e){return e>0?q(D(e),9007199254740991):0},B=function(e,t,n){t in e?g.f(e,t,y(0,n)):e[t]=n},H={}.toString,U=function(e){return H.call(e).slice(8,-1)},W=x("toStringTag"),z="Arguments"==U(function(){return arguments}()),K=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),W))?n:z?U(t):"Object"==(i=U(t))&&"function"==typeof t.callee?"Arguments":i},Y=x("iterator"),G=o.getIteratorMethod=function(e){if(null!=e)return e[Y]||e["@@iterator"]||M[K(e)]},$=x("iterator"),J=!1;try{[7][$]().return=function(){J=!0}}catch(e){}var Q=function(e,t){if(!t&&!J)return!1;var n=!1;try{var i=[7],r=i[$]();r.next=function(){return{done:n=!0}},i[$]=function(){return r},e(i)}catch(e){}return n};S(S.S+S.F*!Q(function(e){}),"Array",{from:function(e){var t,n,r,o,a=C(e),s="function"==typeof this?this:Array,l=arguments.length,c=l>1?arguments[1]:void 0,u=void 0!==c,d=0,h=G(a);if(u&&(c=i(c,l>2?arguments[2]:void 0,2)),null==h||s==Array&&I(h))for(n=new s(t=V(a.length));t>d;d++)B(n,d,u?c(a[d],d):a[d]);else for(o=h.call(a),n=new s;!(r=o.next()).done;d++)B(n,d,u?L(o,c,[r.value,d],!0):r.value);return n.length=d,n}});var X=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==U(e)?e.split(""):Object(e)},Z=Array.isArray||function(e){return"Array"==U(e)},ee=x("species"),te=function(e,t){return new(function(e){var t;return Z(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!Z(t.prototype)||(t=void 0),a(t)&&null===(t=t[ee])&&(t=void 0)),void 0===t?Array:t}(e))(t)},ne=function(e,t){var n=1==e,r=2==e,o=3==e,a=4==e,s=6==e,l=5==e||s,c=t||te;return function(t,u,d){for(var h,f,p=C(t),m=X(p),g=i(u,d,3),y=V(m.length),v=0,b=n?c(t,y):r?c(t,0):void 0;y>v;v++)if((l||v in m)&&(f=g(h=m[v],v,p),e))if(n)b[v]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return v;case 2:b.push(h)}else if(a)return!1;return s?-1:o||a?a:b}},ie=x("unscopables"),re=Array.prototype;null==re[ie]&&v(re,ie,{});var oe=function(e){re[ie][e]=!0},ae=ne(5),se=!0;"find"in[]&&Array(1).find(function(){se=!1}),S(S.P+S.F*se,"Array",{find:function(e){return ae(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("find");var le={f:{}.propertyIsEnumerable},ce=function(e){return X(P(e))},ue=Object.getOwnPropertyDescriptor,de={f:c?ue:function(e,t){if(e=ce(e),t=p(t,!0),f)try{return ue(e,t)}catch(e){}if(k(e,t))return y(!le.f.call(e,t),e[t])}},he=function(e,t){if(s(e),!a(t)&&null!==t)throw TypeError(t+": can't set as prototype!")},fe={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=i(Function.call,de.f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,i){return he(e,i),t?e.__proto__=i:n(e,i),e}}({},!1):void 0),check:he}.set,pe=function(e,t,n){var i,r=t.constructor;return r!==n&&"function"==typeof r&&(i=r.prototype)!==n.prototype&&a(i)&&fe&&fe(e,i),e},me=Math.max,ge=Math.min,ye=function(e){return function(t,n,i){var r,o=ce(t),a=V(o.length),s=function(e,t){return(e=D(e))<0?me(e+t,0):ge(e,t)}(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}},ve=N("keys"),be=function(e){return ve[e]||(ve[e]=E(e))},ke=ye(!1),we=be("IE_PROTO"),Te=function(e,t){var n,i=ce(e),r=0,o=[];for(n in i)n!=we&&k(i,n)&&o.push(n);for(;t.length>r;)k(i,n=t[r++])&&(~ke(o,n)||o.push(n));return o},Ee="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Ae=Ee.concat("length","prototype"),_e={f:Object.getOwnPropertyNames||function(e){return Te(e,Ae)}},Se="\t\n\v\f\r \u2028\u2029\ufeff",Pe="["+Se+"]",Ce=RegExp("^"+Pe+Pe+"*"),Le=RegExp(Pe+Pe+"*$"),Me=function(e,t,n){var i={},r=l(function(){return!!Se[e]()||"
"!="
"[e]()}),o=i[e]=r?t(Ne):Se[e];n&&(i[n]=o),S(S.P+S.F*r,"String",i)},Ne=Me.trim=function(e,t){return e=String(P(e)),1&t&&(e=e.replace(Ce,"")),2&t&&(e=e.replace(Le,"")),e},xe=Me,Oe=Object.keys||function(e){return Te(e,Ee)},je=c?Object.defineProperties:function(e,t){s(e);for(var n,i=Oe(t),r=i.length,o=0;r>o;)g.f(e,n=i[o++],t[n]);return e},Ie=r.document,Re=Ie&&Ie.documentElement,Fe=be("IE_PROTO"),De=function(){},qe=function(){var e,t=h("iframe"),n=Ee.length;for(t.style.display="none",Re.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[Ee[n]];return qe()},Ve=Object.create||function(e,t){var n;return null!==e?(De.prototype=s(e),n=new De,De.prototype=null,n[Fe]=e):n=qe(),void 0===t?n:je(n,t)},Be=_e.f,He=de.f,Ue=g.f,We=xe.trim,ze=r.Number,Ke=ze,Ye=ze.prototype,Ge="Number"==U(Ve(Ye)),$e="trim"in String.prototype,Je=function(e){var t=p(e,!1);if("string"==typeof t&&t.length>2){var n,i,r,o=(t=$e?t.trim():We(t,3)).charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+t}for(var a,s=t.slice(2),l=0,c=s.length;l<c;l++)if((a=s.charCodeAt(l))<48||a>r)return NaN;return parseInt(s,i)}}return+t};if(!ze(" 0o1")||!ze("0b1")||ze("+0x1")){ze=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof ze&&(Ge?l(function(){Ye.valueOf.call(n)}):"Number"!=U(n))?pe(new Ke(Je(t)),n,ze):Je(t)};for(var Qe,Xe=c?Be(Ke):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Ze=0;Xe.length>Ze;Ze++)k(Ke,Qe=Xe[Ze])&&!k(ze,Qe)&&Ue(ze,Qe,He(Ke,Qe));ze.prototype=Ye,Ye.constructor=ze,A(r,"Number",ze)}!function(e,t){var n=(o.Object||{})[e]||Object[e],i={};i[e]=t(n),S(S.S+S.F*l(function(){n(1)}),"Object",i)}("keys",function(){return function(e){return Oe(C(e))}});var et=x("match"),tt=function(e){var t;return a(e)&&(void 0!==(t=e[et])?!!t:"RegExp"==U(e))},nt=function(e,t,n){if(tt(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(P(e))},it=x("match"),rt=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[it]=!1,!"/./"[e](t)}catch(e){}}return!0};S(S.P+S.F*rt("includes"),"String",{includes:function(e){return!!~nt(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}});var ot=ye(!0);S(S.P,"Array",{includes:function(e){return ot(this,e,arguments.length>1?arguments[1]:void 0)}}),oe("includes");var at=function(e,t,n){var i=x(e),r=n(P,i,""[e]),o=r[0],a=r[1];l(function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})&&(A(String.prototype,e,o),v(RegExp.prototype,i,2==t?function(e,t){return a.call(e,this,t)}:function(e){return a.call(e,this)}))};at("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 st=function(){var e=s(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};c&&"g"!=/./g.flags&&g.f(RegExp.prototype,"flags",{configurable:!0,get:st});var lt=/./.toString,ct=function(e){A(RegExp.prototype,"toString",e,!0)};l(function(){return"/a/b"!=lt.call({source:"a",flags:"b"})})?ct(function(){var e=s(this);return"/".concat(e.source,"/","flags"in e?e.flags:!c&&e instanceof RegExp?st.call(e):void 0)}):"toString"!=lt.name&&ct(function(){return lt.call(this)});var ut=function(e,t){return{value:t,done:!!e}},dt=g.f,ht=x("toStringTag"),ft=function(e,t,n){e&&!k(e=n?e:e.prototype,ht)&&dt(e,ht,{configurable:!0,value:t})},pt={};v(pt,x("iterator"),function(){return this});var mt=function(e,t,n){e.prototype=Ve(pt,{next:y(1,n)}),ft(e,t+" Iterator")},gt=be("IE_PROTO"),yt=Object.prototype,vt=Object.getPrototypeOf||function(e){return e=C(e),k(e,gt)?e[gt]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?yt:null},bt=x("iterator"),kt=!([].keys&&"next"in[].keys()),wt=function(){return this},Tt=function(e,t,n,i,r,o,a){mt(n,t,i);var s,l,c,u=function(e){if(!kt&&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)}},d=t+" Iterator",h="values"==r,f=!1,p=e.prototype,m=p[bt]||p["@@iterator"]||r&&p[r],g=m||u(r),y=r?h?u("entries"):g:void 0,b="Array"==t&&p.entries||m;if(b&&(c=vt(b.call(new e)))!==Object.prototype&&c.next&&(ft(c,d,!0),"function"!=typeof c[bt]&&v(c,bt,wt)),h&&m&&"values"!==m.name&&(f=!0,g=function(){return m.call(this)}),(kt||f||!p[bt])&&v(p,bt,g),M[t]=g,M[d]=wt,r)if(s={values:h?g:u("values"),keys:o?g:u("keys"),entries:y},a)for(l in s)l in p||A(p,l,s[l]);else S(S.P+S.F*(kt||f),t,s);return s},Et=Tt(Array,"Array",function(e,t){this._t=ce(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,ut(1)):ut(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");M.Arguments=M.Array,oe("keys"),oe("values"),oe("entries");for(var At=x("iterator"),_t=x("toStringTag"),St=M.Array,Pt={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},Ct=Oe(Pt),Lt=0;Lt<Ct.length;Lt++){var Mt,Nt=Ct[Lt],xt=Pt[Nt],Ot=r[Nt],jt=Ot&&Ot.prototype;if(jt&&(jt[At]||v(jt,At,St),jt[_t]||v(jt,_t,Nt),M[Nt]=St,xt))for(Mt in Et)jt[Mt]||A(jt,Mt,Et[Mt],!0)}var It=function(e){return function(t,n){var i,r,o=String(P(t)),a=D(n),s=o.length;return a<0||a>=s?e?"":void 0:(i=o.charCodeAt(a))<55296||i>56319||a+1===s||(r=o.charCodeAt(a+1))<56320||r>57343?e?o.charAt(a):i:e?o.slice(a,a+2):r-56320+(i-55296<<10)+65536}}(!0);Tt(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=It(t,n),this._i+=e.length,{value:e,done:!1})});var Rt=t(function(e){var t=E("meta"),n=g.f,i=0,r=Object.isExtensible||function(){return!0},o=!l(function(){return r(Object.preventExtensions({}))}),s=function(e){n(e,t,{value:{i:"O"+ ++i,w:{}}})},c=e.exports={KEY:t,NEED:!1,fastKey:function(e,n){if(!a(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!k(e,t)){if(!r(e))return"F";if(!n)return"E";s(e)}return e[t].i},getWeak:function(e,n){if(!k(e,t)){if(!r(e))return!0;if(!n)return!1;s(e)}return e[t].w},onFreeze:function(e){return o&&c.NEED&&r(e)&&!k(e,t)&&s(e),e}}}),Ft=(Rt.KEY,Rt.NEED,Rt.fastKey,Rt.getWeak,Rt.onFreeze,{f:Object.getOwnPropertySymbols}),Dt=Object.assign,qt=!Dt||l(function(){var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach(function(e){t[e]=e}),7!=Dt({},e)[n]||Object.keys(Dt({},t)).join("")!=i})?function(e,t){for(var n=C(e),i=arguments.length,r=1,o=Ft.f,a=le.f;i>r;)for(var s,l=X(arguments[r++]),c=o?Oe(l).concat(o(l)):Oe(l),u=c.length,d=0;u>d;)a.call(l,s=c[d++])&&(n[s]=l[s]);return n}:Dt,Vt=function(e,t,n){for(var i in t)A(e,i,t[i],n);return e},Bt=function(e,t,n,i){if(!(e instanceof t)||void 0!==i&&i in e)throw TypeError(n+": incorrect invocation!");return e},Ht=t(function(e){var t={},n={},r=e.exports=function(e,r,o,a,l){var c,u,d,h,f=l?function(){return e}:G(e),p=i(o,a,r?2:1),m=0;if("function"!=typeof f)throw TypeError(e+" is not iterable!");if(I(f)){for(c=V(e.length);c>m;m++)if((h=r?p(s(u=e[m])[0],u[1]):p(e[m]))===t||h===n)return h}else for(d=f.call(e);!(u=d.next()).done;)if((h=L(d,p,u.value,r))===t||h===n)return h};r.BREAK=t,r.RETURN=n}),Ut=function(e,t){if(!a(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e},Wt=Rt.getWeak,zt=ne(5),Kt=ne(6),Yt=0,Gt=function(e){return e._l||(e._l=new $t)},$t=function(){this.a=[]},Jt=function(e,t){return zt(e.a,function(e){return e[0]===t})};$t.prototype={get:function(e){var t=Jt(this,e);if(t)return t[1]},has:function(e){return!!Jt(this,e)},set:function(e,t){var n=Jt(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=Kt(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}};var Qt={getConstructor:function(e,t,n,i){var r=e(function(e,o){Bt(e,r,t,"_i"),e._t=t,e._i=Yt++,e._l=void 0,null!=o&&Ht(o,n,e[i],e)});return Vt(r.prototype,{delete:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).delete(e):n&&k(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=Wt(e);return!0===n?Gt(Ut(this,t)).has(e):n&&k(n,this._i)}}),r},def:function(e,t,n){var i=Wt(s(t),!0);return!0===i?Gt(e).set(t,n):i[e._i]=n,e},ufstore:Gt};t(function(e){var t,n=ne(0),i=Rt.getWeak,o=Object.isExtensible,s=Qt.ufstore,c={},u=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},d={get:function(e){if(a(e)){var t=i(e);return!0===t?s(Ut(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return Qt.def(Ut(this,"WeakMap"),e,t)}},h=e.exports=function(e,t,n,i,o,s){var c=r[e],u=c,d=o?"set":"add",h=u&&u.prototype,f={},p=function(e){var t=h[e];A(h,e,"delete"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(s&&!a(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return s&&!a(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&&(s||h.forEach&&!l(function(){(new u).entries().next()}))){var m=new u,g=m[d](s?{}:-0,1)!=m,y=l(function(){m.has(1)}),v=Q(function(e){new u(e)}),b=!s&&l(function(){for(var e=new u,t=5;t--;)e[d](t,t);return!e.has(-0)});v||((u=t(function(t,n){Bt(t,u,e);var i=pe(new c,t,u);return null!=n&&Ht(n,o,i[d],i),i})).prototype=h,h.constructor=u),(y||b)&&(p("delete"),p("has"),o&&p("get")),(b||g)&&p(d),s&&h.clear&&delete h.clear}else u=i.getConstructor(t,e,o,d),Vt(u.prototype,n),Rt.NEED=!0;return ft(u,e),f[e]=u,S(S.G+S.W+S.F*(u!=c),f),s||i.setStrong(u,e,o),u}("WeakMap",u,d,Qt,!0,!0);l(function(){return 7!=(new h).set((Object.freeze||Object)(c),7).get(c)})&&(t=Qt.getConstructor(u,"WeakMap"),qt(t.prototype,d),Rt.NEED=!0,n(["delete","has","get","set"],function(e){var n=h.prototype,i=n[e];A(n,e,function(n,r){if(a(n)&&!o(n)){this._f||(this._f=new t);var s=this._f[e](n,r);return"set"==e?this:s}return i.call(this,n,r)})}))});function Xt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Zt(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)}}function en(e,t,n){return t&&Zt(e.prototype,t),n&&Zt(e,n),e}function tn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function nn(e,t){return function(e){if(Array.isArray(e))return e}(e)||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||null==s.return||s.return()}finally{if(r)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function rn(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}S(S.S+S.F,"Object",{assign:qt}),at("split",2,function(e,t,n){var i=tt,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,d,h=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),p=0,m=void 0===t?4294967295:t>>>0,g=new RegExp(e.source,f+"g");for(a||(s=new RegExp("^"+g.source+"$(?!\\s)",f));(l=g.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(d=1;d<arguments.length-2;d++)void 0===arguments[d]&&(l[d]=void 0)}),l.length>1&&l.index<n.length&&o.apply(h,l.slice(1)),u=l[0].length,p=c,h.length>=m));)g.lastIndex===l.index&&g.lastIndex++;return p===n.length?!u&&g.test("")||h.push(""):h.push(n.slice(p)),h.length>m?h.slice(0,m):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]});var on=le.f,an=function(e){return function(t){for(var n,i=ce(t),r=Oe(i),o=r.length,a=0,s=[];o>a;)on.call(i,n=r[a++])&&s.push(e?[n,i[n]]:i[n]);return s}},sn=an(!0);S(S.S,"Object",{entries:function(e){return sn(e)}});var ln=an(!1);S(S.S,"Object",{values:function(e){return ln(e)}}),at("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]});var cn,un,dn,hn=x("species"),fn=r.process,pn=r.setImmediate,mn=r.clearImmediate,gn=r.MessageChannel,yn=r.Dispatch,vn=0,bn={},kn=function(){var e=+this;if(bn.hasOwnProperty(e)){var t=bn[e];delete bn[e],t()}},wn=function(e){kn.call(e.data)};pn&&mn||(pn=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return bn[++vn]=function(){!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])}e.apply(n,t)}("function"==typeof e?e:Function(e),t)},cn(vn),vn},mn=function(e){delete bn[e]},"process"==U(fn)?cn=function(e){fn.nextTick(i(kn,e,1))}:yn&&yn.now?cn=function(e){yn.now(i(kn,e,1))}:gn?(dn=(un=new gn).port2,un.port1.onmessage=wn,cn=i(dn.postMessage,dn,1)):r.addEventListener&&"function"==typeof postMessage&&!r.importScripts?(cn=function(e){r.postMessage(e+"","*")},r.addEventListener("message",wn,!1)):cn="onreadystatechange"in h("script")?function(e){Re.appendChild(h("script")).onreadystatechange=function(){Re.removeChild(this),kn.call(e)}}:function(e){setTimeout(i(kn,e,1),0)});var Tn={set:pn,clear:mn},En=Tn.set,An=r.MutationObserver||r.WebKitMutationObserver,_n=r.process,Sn=r.Promise,Pn="process"==U(_n);function Cn(e){var t,i;this.promise=new e(function(e,n){if(void 0!==t||void 0!==i)throw TypeError("Bad Promise constructor");t=e,i=n}),this.resolve=n(t),this.reject=n(i)}var Ln,Mn,Nn,xn,On={f:function(e){return new Cn(e)}},jn=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},In=r.navigator,Rn=In&&In.userAgent||"",Fn=x("species"),Dn=function(e){var t=r[e];c&&t&&!t[Fn]&&g.f(t,Fn,{configurable:!0,get:function(){return this}})},qn=Tn.set,Vn=function(){var e,t,n,i=function(){var i,r;for(Pn&&(i=_n.domain)&&i.exit();e;){r=e.fn,e=e.next;try{r()}catch(i){throw e?n():t=void 0,i}}t=void 0,i&&i.enter()};if(Pn)n=function(){_n.nextTick(i)};else if(!An||r.navigator&&r.navigator.standalone)if(Sn&&Sn.resolve){var o=Sn.resolve(void 0);n=function(){o.then(i)}}else n=function(){En.call(r,i)};else{var a=!0,s=document.createTextNode("");new An(i).observe(s,{characterData:!0}),n=function(){s.data=a=!a}}return function(i){var r={fn:i,next:void 0};t&&(t.next=r),e||(e=r,n()),t=r}}(),Bn=r.TypeError,Hn=r.process,Un=Hn&&Hn.versions,Wn=Un&&Un.v8||"",zn=r.Promise,Kn="process"==K(Hn),Yn=function(){},Gn=Mn=On.f,$n=!!function(){try{var e=zn.resolve(1),t=(e.constructor={})[x("species")]=function(e){e(Yn,Yn)};return(Kn||"function"==typeof PromiseRejectionEvent)&&e.then(Yn)instanceof t&&0!==Wn.indexOf("6.6")&&-1===Rn.indexOf("Chrome/66")}catch(e){}}(),Jn=function(e){var t;return!(!a(e)||"function"!=typeof(t=e.then))&&t},Qn=function(e,t){if(!e._n){e._n=!0;var n=e._c;Vn(function(){for(var i=e._v,r=1==e._s,o=0,a=function(t){var n,o,a,s=r?t.ok:t.fail,l=t.resolve,c=t.reject,u=t.domain;try{s?(r||(2==e._h&&ei(e),e._h=1),!0===s?n=i:(u&&u.enter(),n=s(i),u&&(u.exit(),a=!0)),n===t.promise?c(Bn("Promise-chain cycle")):(o=Jn(n))?o.call(n,l,c):l(n)):c(i)}catch(e){u&&!a&&u.exit(),c(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&Xn(e)})}},Xn=function(e){qn.call(r,function(){var t,n,i,o=e._v,a=Zn(e);if(a&&(t=jn(function(){Kn?Hn.emit("unhandledRejection",o,e):(n=r.onunhandledrejection)?n({promise:e,reason:o}):(i=r.console)&&i.error&&i.error("Unhandled promise rejection",o)}),e._h=Kn||Zn(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},Zn=function(e){return 1!==e._h&&0===(e._a||e._c).length},ei=function(e){qn.call(r,function(){var t;Kn?Hn.emit("rejectionHandled",e):(t=r.onrejectionhandled)&&t({promise:e,reason:e._v})})},ti=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()),Qn(t,!0))},ni=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw Bn("Promise can't be resolved itself");(t=Jn(e))?Vn(function(){var r={_w:n,_d:!1};try{t.call(e,i(ni,r,1),i(ti,r,1))}catch(e){ti.call(r,e)}}):(n._v=e,n._s=1,Qn(n,!1))}catch(e){ti.call({_w:n,_d:!1},e)}}};$n||(zn=function(e){Bt(this,zn,"Promise","_h"),n(e),Ln.call(this);try{e(i(ni,this,1),i(ti,this,1))}catch(e){ti.call(this,e)}},(Ln=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=Vt(zn.prototype,{then:function(e,t){var i,r,o,a=Gn((i=zn,void 0===(o=s(this).constructor)||null==(r=s(o)[hn])?i:n(r)));return a.ok="function"!=typeof e||e,a.fail="function"==typeof t&&t,a.domain=Kn?Hn.domain:void 0,this._c.push(a),this._a&&this._a.push(a),this._s&&Qn(this,!1),a.promise},catch:function(e){return this.then(void 0,e)}}),Nn=function(){var e=new Ln;this.promise=e,this.resolve=i(ni,e,1),this.reject=i(ti,e,1)},On.f=Gn=function(e){return e===zn||e===xn?new Nn(e):Mn(e)}),S(S.G+S.W+S.F*!$n,{Promise:zn}),ft(zn,"Promise"),Dn("Promise"),xn=o.Promise,S(S.S+S.F*!$n,"Promise",{reject:function(e){var t=Gn(this);return(0,t.reject)(e),t.promise}}),S(S.S+S.F*!$n,"Promise",{resolve:function(e){return function(e,t){if(s(e),a(t)&&t.constructor===e)return t;var n=On.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),S(S.S+S.F*!($n&&Q(function(e){zn.all(e).catch(Yn)})),"Promise",{all:function(e){var t=this,n=Gn(t),i=n.resolve,r=n.reject,o=jn(function(){var n=[],o=0,a=1;Ht(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=Gn(t),i=n.reject,r=jn(function(){Ht(e,!1,function(e){t.resolve(e).then(n.resolve,i)})});return r.e&&i(r.v),n.promise}});var ii="".startsWith;S(S.P+S.F*rt("startsWith"),"String",{startsWith:function(e){var t=nt(this,e,"startsWith"),n=V(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return ii?ii.call(t,i,n):t.slice(n,n+i.length)===i}}),S(S.S,"Number",{isNaN:function(e){return e!=e}});var ri=function(e){return null!=e?e.constructor:null},oi=function(e,t){return Boolean(e&&t&&e instanceof t)},ai=function(e){return null==e},si=function(e){return ri(e)===Object},li=function(e){return ri(e)===String},ci=function(e){return Array.isArray(e)},ui=function(e){return oi(e,NodeList)},di=function(e){return ai(e)||(li(e)||ci(e)||ui(e))&&!e.length||si(e)&&!Object.keys(e).length},hi={nullOrUndefined:ai,object:si,number:function(e){return ri(e)===Number&&!Number.isNaN(e)},string:li,boolean:function(e){return ri(e)===Boolean},function:function(e){return ri(e)===Function},array:ci,weakMap:function(e){return oi(e,WeakMap)},nodeList:ui,element:function(e){return oi(e,Element)},textNode:function(e){return ri(e)===Text},event:function(e){return oi(e,Event)},keyboardEvent:function(e){return oi(e,KeyboardEvent)},cue:function(e){return oi(e,window.TextTrackCue)||oi(e,window.VTTCue)},track:function(e){return oi(e,TextTrack)||!ai(e)&&li(e.kind)},url:function(e){if(oi(e,window.URL))return!0;if(!li(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!di(new URL(t).hostname)}catch(e){return!1}},empty:di},fi=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 pi(e,t,n){var i=this,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!hi.empty(t)&&hi.function(n)){var s=t.split(" "),l=a;fi&&(l={passive:o,capture:a}),s.forEach(function(t){i&&i.eventListeners&&r&&i.eventListeners.push({element:e,type:t,callback:n,options:l}),e[r?"addEventListener":"removeEventListener"](t,n,l)})}}function mi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!0,i,r)}function gi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,n,!1,i,r)}function yi(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];pi.call(this,e,t,function o(){gi(e,t,o,i,r);for(var a=arguments.length,s=new Array(a),l=0;l<a;l++)s[l]=arguments[l];n.apply(this,s)},!0,i,r)}function vi(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(hi.element(e)&&!hi.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:Object.assign({},i,{plyr:this})});e.dispatchEvent(r)}}function bi(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 ki(e,t){hi.element(e)&&!hi.empty(t)&&Object.entries(t).filter(function(e){var t=nn(e,2)[1];return!hi.nullOrUndefined(t)}).forEach(function(t){var n=nn(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)})}function wi(e,t,n){var i=document.createElement(e);return hi.object(t)&&ki(i,t),hi.string(n)&&(i.innerText=n),i}function Ti(e,t,n,i){hi.element(t)&&t.appendChild(wi(e,n,i))}function Ei(e){hi.nodeList(e)||hi.array(e)?Array.from(e).forEach(Ei):hi.element(e)&&hi.element(e.parentNode)&&e.parentNode.removeChild(e)}function Ai(e){if(hi.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function _i(e,t){return hi.element(t)&&hi.element(t.parentNode)&&hi.element(e)?(t.parentNode.replaceChild(e,t),e):null}function Si(e,t){if(!hi.string(e)||hi.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".":hi.object(i)&&hi.string(i.class)&&(i.class+=" ".concat(r)),n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}}),n}function Pi(e,t){if(hi.element(e)){var n=t;hi.boolean(n)||(n=!e.hidden),n?e.setAttribute("hidden",""):e.removeAttribute("hidden")}}function Ci(e,t,n){if(hi.nodeList(e))return Array.from(e).map(function(e){return Ci(e,t,n)});if(hi.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function Li(e,t){return hi.element(e)&&e.classList.contains(t)}function Mi(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 Ni(e){return this.elements.container.querySelectorAll(e)}function xi(e){return this.elements.container.querySelector(e)}function Oi(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];hi.element(e)&&(e.focus(),t&&Ci(e,this.config.classNames.tabFocus))}var ji,Ii,Ri,Fi=(ji=document.createElement("span"),Ii={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},Ri=Object.keys(Ii).find(function(e){return void 0!==ji.style[e]}),!!hi.string(Ri)&&Ii[Ri]);function Di(e){setTimeout(function(){try{Pi(e,!0),e.offsetHeight,Pi(e,!1)}catch(e){}},0)}var qi,Vi={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)},Bi={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Hi={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=Vi.isIPhone&&n&&Hi.playsinline,r=Hi[e]||"html5"!==t;return{api:r,ui:r&&Hi.rangeInput&&("video"!==e||!Vi.isIPhone||i)}},pip:!Vi.isIPhone&&hi.function(wi("video").webkitSetPresentationMode),airplay:hi.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){var t,n=nn(e.split("/"),1)[0];if(!this.isHTML5||n!==this.type)return!1;e&&e.includes("codecs=")?t=e:"audio/mpeg"===e?t="audio/mpeg;":e in Bi&&(t="".concat(e,'; codecs="').concat(Bi[e],'"'));try{return Boolean(t&&this.media.canPlayType(t).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(qi=document.createElement("input"),qi.type="range","range"===qi.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Fi,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Ui={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter(function(t){return Hi.mime.call(e,t.getAttribute("type"))}):[]},getQualityOptions:function(){return Ui.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=Ui.getSources.call(e).find(function(t){return t.getAttribute("src")===e.source});return t&&Number(t.getAttribute("size"))},set:function(t){var n=Ui.getSources.call(e).find(function(e){return Number(e.getAttribute("size"))===t});if(n){var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",function(){e.currentTime=r,o||e.play()}),e.media.load()),vi.call(e,e.media,"qualitychange",!1,{quality:t}),e.storage.set({quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Ei(Ui.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Wi(e){return hi.array(e)?e.filter(function(t,n){return e.indexOf(t)===n}):e}function zi(e,t){return t.split(".").reduce(function(e,t){return e&&e[t]},e)}function Ki(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new 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 hi.object(r)?(Object.keys(r).forEach(function(t){hi.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,tn({},t,{})),Ki(e[t],r[t])):Object.assign(e,tn({},t,r[t]))}),Ki.apply(void 0,[e].concat(n))):e}var Yi=g.f,Gi=_e.f,$i=r.RegExp,Ji=$i,Qi=$i.prototype,Xi=/a/g,Zi=/a/g,er=new $i(Xi)!==Xi;if(c&&(!er||l(function(){return Zi[x("match")]=!1,$i(Xi)!=Xi||$i(Zi)==Zi||"/a/i"!=$i(Xi,"i")}))){$i=function(e,t){var n=this instanceof $i,i=tt(e),r=void 0===t;return!n&&i&&e.constructor===$i&&r?e:pe(er?new Ji(i&&!r?e.source:e,t):Ji((i=e instanceof $i)?e.source:e,i&&r?st.call(e):t),n?this:Qi,$i)};for(var tr=function(e){e in $i||Yi($i,e,{configurable:!0,get:function(){return Ji[e]},set:function(t){Ji[e]=t}})},nr=Gi(Ji),ir=0;nr.length>ir;)tr(nr[ir++]);Qi.constructor=$i,$i.prototype=Qi,A(r,"RegExp",$i)}function rr(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i<t;i++)n[i-1]=arguments[i];return hi.empty(e)?e:e.toString().replace(/{(\d+)}/g,function(e,t){return n[t].toString()})}function or(){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 ar(){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 sr(){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=or(e,"-"," "),e=or(e,"_"," "),or(e=ar(e)," ","")}(e)).charAt(0).toLowerCase()+e.slice(1)}function lr(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}Dn("RegExp");var cr={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},ur=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(hi.empty(e)||hi.empty(t))return"";var n=zi(t.i18n,e);if(hi.empty(n))return Object.keys(cr).includes(e)?cr[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach(function(e){var t=nn(e,2),i=t[0],r=t[1];n=or(n,i,r)}),n},dr=function(){function e(t){Xt(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return en(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(hi.empty(n))return null;var i=JSON.parse(n);return hi.string(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&hi.object(t)){var n=this.get();hi.empty(n)&&(n={}),Ki(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 hr(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.status)}),r.open("GET",e,!0),r.responseType=t,r.send()}catch(e){i(e)}})}function fr(e,t){if(hi.string(e)){var n=hi.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=dr.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),n&&a.setAttribute("id",t),o){var s=window.localStorage.getItem("".concat("cache","-").concat(t));if(null!==s){var l=JSON.parse(s);r(a,l.content)}}hr(e).then(function(e){hi.empty(e)||(o&&window.localStorage.setItem("".concat("cache","-").concat(t),JSON.stringify({content:e})),r(a,e))}).catch(function(){})}}}var pr=function(e){return parseInt(e/60/60%60,10)},mr=function(e){return parseInt(e/60%60,10)},gr=function(e){return parseInt(e%60,10)};function yr(){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(!hi.number(e))return yr(null,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=pr(e),o=mr(e),a=gr(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(a))}var vr={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Vi.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=xi.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Ni.call(this,this.config.selectors.buttons.play),pause:xi.call(this,this.config.selectors.buttons.pause),restart:xi.call(this,this.config.selectors.buttons.restart),rewind:xi.call(this,this.config.selectors.buttons.rewind),fastForward:xi.call(this,this.config.selectors.buttons.fastForward),mute:xi.call(this,this.config.selectors.buttons.mute),pip:xi.call(this,this.config.selectors.buttons.pip),airplay:xi.call(this,this.config.selectors.buttons.airplay),settings:xi.call(this,this.config.selectors.buttons.settings),captions:xi.call(this,this.config.selectors.buttons.captions),fullscreen:xi.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=xi.call(this,this.config.selectors.progress),this.elements.inputs={seek:xi.call(this,this.config.selectors.inputs.seek),volume:xi.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:xi.call(this,this.config.selectors.display.buffer),currentTime:xi.call(this,this.config.selectors.display.currentTime),duration:xi.call(this,this.config.selectors.display.duration)},hi.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(".".concat(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=vr.getIconUrl.call(this),i="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),r=document.createElementNS("http://www.w3.org/2000/svg","svg");ki(r,Ki(t,{role:"presentation",focusable:"false"}));var o=document.createElementNS("http://www.w3.org/2000/svg","use"),a="".concat(i,"-").concat(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){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=ur(e,this.config);return wi("span",Object.assign({},t,{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")}),n)},createBadge:function(e){if(hi.empty(e))return null;var t=wi("span",{class:this.config.classNames.menu.value});return t.appendChild(wi("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=Object.assign({},t),i=sr(e),r={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(function(e){Object.keys(n).includes(e)&&(r[e]=n[e],delete n[e])}),"button"!==r.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.includes(this.config.classNames.control)||(n.class+=" ".concat(this.config.classNames.control)):n.class=this.config.classNames.control,e){case"play":r.toggle=!0,r.label="play",r.labelPressed="pause",r.icon="play",r.iconPressed="pause";break;case"mute":r.toggle=!0,r.label="mute",r.labelPressed="unmute",r.icon="volume",r.iconPressed="muted";break;case"captions":r.toggle=!0,r.label="enableCaptions",r.labelPressed="disableCaptions",r.icon="captions-off",r.iconPressed="captions-on";break;case"fullscreen":r.toggle=!0,r.label="enterFullscreen",r.labelPressed="exitFullscreen",r.icon="enter-fullscreen",r.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",r.label="play",r.icon="play";break;default:hi.empty(r.label)&&(r.label=i),hi.empty(r.icon)&&(r.icon=e)}var o=wi(r.element);return r.toggle?(o.appendChild(vr.createIcon.call(this,r.iconPressed,{class:"icon--pressed"})),o.appendChild(vr.createIcon.call(this,r.icon,{class:"icon--not-pressed"})),o.appendChild(vr.createLabel.call(this,r.labelPressed,{class:"label--pressed"})),o.appendChild(vr.createLabel.call(this,r.label,{class:"label--not-pressed"}))):(o.appendChild(vr.createIcon.call(this,r.icon)),o.appendChild(vr.createLabel.call(this,r.label))),Ki(n,Si(this.config.selectors.buttons[i],n)),ki(o,n),"play"===i?(hi.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(o)):this.elements.buttons[i]=o,o},createRange:function(e,t){var n=wi("input",Ki(Si(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":ur(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,vr.updateRangeFill.call(this,n),n},createProgress:function(e,t){var n=wi("progress",Ki(Si(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"presentation","aria-hidden":!0},t));if("volume"!==e){n.appendChild(wi("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?ur(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e){var t=Si(this.config.selectors.display[e]),n=wi("div",Ki(t,{class:"".concat(this.config.classNames.display.time," ").concat(t.class?t.class:"").trim(),"aria-label":ur(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var n=this;mi(e,"keydown keyup",function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=Mi(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))vr.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,hi.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,hi.element(r)||(r=e.parentNode.lastElementChild)),Oi.call(n,r,!0))}},!1),mi(e,"keyup",function(e){13===e.which&&vr.focusFirstMenuItem.call(n,null,!0)})},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=Si(this.config.selectors.inputs[r]),d=wi("button",Ki(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=wi("span");h.innerHTML=o,hi.element(s)&&h.appendChild(s),d.appendChild(h),Object.defineProperty(d,"checked",{enumerable:!0,get:function(){return"true"===d.getAttribute("aria-checked")},set:function(e){e&&Array.from(d.parentNode.children).filter(function(e){return Mi(e,'[role="menuitemradio"]')}).forEach(function(e){return e.setAttribute("aria-checked","false")}),d.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(d,"click keyup",function(e){if(!hi.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}vr.showMenuPanel.call(t,"home",hi.keyboardEvent(e))}},r,!1),vr.bindMenuItemShortcuts.call(this,d,r),i.appendChild(d)},formatTime:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return hi.number(e)?yr(e,pr(this.duration)>0,t):e},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];hi.element(e)&&hi.number(t)&&(e.innerText=vr.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(hi.element(this.elements.inputs.volume)&&vr.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),hi.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;hi.element(e)&&(e.value=t,vr.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&hi.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&&vr.setRange.call(this,this.elements.inputs.seek,r);break;case"playing":case"progress":!function(e,n){var i=hi.number(n)?n:0,r=hi.element(e)?e:t.elements.display.buffer;if(hi.element(r)){r.value=i;var o=r.getElementsByTagName("span")[0];hi.element(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=hi.event(e)?e.target:e;if(hi.element(t)&&"range"===t.getAttribute("type")){if(Mi(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=vr.formatTime(this.currentTime),i=vr.formatTime(this.duration),r=ur("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(Mi(t,this.config.selectors.inputs.volume)){var o=100*t.value;t.setAttribute("aria-valuenow",o),t.setAttribute("aria-valuetext","".concat(o.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);Vi.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&hi.element(this.elements.inputs.seek)&&hi.element(this.elements.display.seekTooltip)&&0!==this.duration){var n=0,i=this.elements.progress.getBoundingClientRect(),r="".concat(this.config.classNames.tooltip,"--visible"),o=function(e){Ci(t.elements.display.seekTooltip,r,e)};if(this.touch)o(!1);else{if(hi.event(e))n=100/i.width*(e.pageX-i.left);else{if(!Li(this.elements.display.seekTooltip,r))return;n=parseFloat(this.elements.display.seekTooltip.style.left,10)}n<0?n=0:n>100&&(n=100),vr.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*n),this.elements.display.seekTooltip.style.left="".concat(n,"%"),hi.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&o("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!hi.element(this.elements.display.duration)&&this.config.invertTime;vr.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||vr.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return Pi(this.elements.display.currentTime,!0),void Pi(this.elements.progress,!0);hi.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=hi.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&vr.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&vr.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),vr.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){Pi(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,o=t;if("captions"===e)r=this.currentTrack;else{if(r=hi.empty(n)?this[e]:n,hi.empty(r)&&(r=this.config[e].default),!hi.empty(this.options[e])&&!this.options[e].includes(r))return void this.debug.warn("Unsupported value of '".concat(r,"' for ").concat(e));if(!this.config[e].options.includes(r))return void this.debug.warn("Disabled value of '".concat(r,"' for ").concat(e))}if(hi.element(o)||(o=i&&i.querySelector('[role="menu"]')),hi.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=vr.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'.concat(r,'"]'));hi.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?ur("normal",this.config):"".concat(t,"×");case"quality":if(hi.number(t)){var n=ur("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return ar(t);case"captions":return wr.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.quality)){var n=this.elements.settings.panels.quality.querySelector('[role="menu"]');hi.array(e)&&(this.options.quality=Wi(e).filter(function(e){return t.config.quality.options.includes(e)}));var i=!hi.empty(this.options.quality)&&this.options.quality.length>1;if(vr.toggleMenuButton.call(this,"quality",i),Ai(n),vr.checkMenu.call(this),i){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){vr.createMenuItem.call(t,{value:e,list:n,type:"quality",title:vr.getLabel.call(t,"quality",e),badge:function(e){var n=ur("qualityBadge.".concat(e),t.config);return n.length?vr.createBadge.call(t,n):null}(e)})}),vr.updateSetting.call(this,"quality",n)}}},setCaptionsMenu:function(){var e=this;if(hi.element(this.elements.settings.panels.captions)){var t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=wr.getTracks.call(this),i=Boolean(n.length);if(vr.toggleMenuButton.call(this,"captions",i),Ai(t),vr.checkMenu.call(this),i){var r=n.map(function(n,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:wr.getLabel.call(e,n),badge:n.language&&vr.createBadge.call(e,n.language.toUpperCase()),list:t,type:"language"}});r.unshift({value:-1,checked:!this.captions.toggled,title:ur("disabled",this.config),list:t,type:"language"}),r.forEach(vr.createMenuItem.bind(this)),vr.updateSetting.call(this,"captions",t)}}},setSpeedMenu:function(e){var t=this;if(hi.element(this.elements.settings.panels.speed)){var n=this.elements.settings.panels.speed.querySelector('[role="menu"]');hi.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 i=!hi.empty(this.options.speed)&&this.options.speed.length>1;vr.toggleMenuButton.call(this,"speed",i),Ai(n),vr.checkMenu.call(this),i&&(this.options.speed.forEach(function(e){vr.createMenuItem.call(t,{value:e,list:n,type:"speed",title:vr.getLabel.call(t,"speed",e)})}),vr.updateSetting.call(this,"speed",n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!hi.empty(e)&&Object.values(e).some(function(e){return!e.hidden});Pi(this.elements.settings.menu,!t)},focusFirstMenuItem:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!this.elements.settings.popup.hidden){var n=e;hi.element(n)||(n=Object.values(this.elements.settings.panels).find(function(e){return!e.hidden}));var i=n.querySelector('[role^="menuitem"]');Oi.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(hi.element(t)&&hi.element(n)){var i=t.hidden,r=i;if(hi.boolean(e))r=e;else if(hi.keyboardEvent(e)&&27===e.which)r=!1;else if(hi.event(e)){var o=t.contains(e.target);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),Pi(t,!r),Ci(this.elements.container,this.config.classNames.menu.open,r),r&&hi.keyboardEvent(e)?vr.focusFirstMenuItem.call(this,null,!0):r||i||Oi.call(this,n,hi.keyboardEvent(e))}},getMenuSize:function(e){var t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);var n=t.scrollWidth,i=t.scrollHeight;return Ei(t),{width:n,height:i}},showMenuPanel:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=document.getElementById("plyr-settings-".concat(this.id,"-").concat(t));if(hi.element(i)){var r=i.parentNode,o=Array.from(r.children).find(function(e){return!e.hidden});if(Hi.transitions&&!Hi.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var a=vr.getMenuSize.call(this,i);mi.call(this,r,Fi,function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",gi.call(e,r,Fi,t))}),r.style.width="".concat(a.width,"px"),r.style.height="".concat(a.height,"px")}Pi(o,!0),Pi(i,!1),vr.focusFirstMenuItem.call(this,i,n)}},setDownloadLink:function(){var e=this.elements.buttons.download;hi.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=wi("div",Si(this.config.selectors.controls.wrapper));if(this.config.controls.includes("restart")&&n.appendChild(vr.createButton.call(this,"restart")),this.config.controls.includes("rewind")&&n.appendChild(vr.createButton.call(this,"rewind")),this.config.controls.includes("play")&&n.appendChild(vr.createButton.call(this,"play")),this.config.controls.includes("fast-forward")&&n.appendChild(vr.createButton.call(this,"fast-forward")),this.config.controls.includes("progress")){var i=wi("div",Si(this.config.selectors.progress));if(i.appendChild(vr.createRange.call(this,"seek",{id:"plyr-seek-".concat(e.id)})),i.appendChild(vr.createProgress.call(this,"buffer")),this.config.tooltips.seek){var r=wi("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(r),this.elements.display.seekTooltip=r}this.elements.progress=i,n.appendChild(this.elements.progress)}if(this.config.controls.includes("current-time")&&n.appendChild(vr.createTime.call(this,"currentTime")),this.config.controls.includes("duration")&&n.appendChild(vr.createTime.call(this,"duration")),this.config.controls.includes("mute")||this.config.controls.includes("volume")){var o=wi("div",{class:"plyr__volume"});if(this.config.controls.includes("mute")&&o.appendChild(vr.createButton.call(this,"mute")),this.config.controls.includes("volume")){var a={max:1,step:.05,value:this.config.volume};o.appendChild(vr.createRange.call(this,"volume",Ki(a,{id:"plyr-volume-".concat(e.id)}))),this.elements.volume=o}n.appendChild(o)}if(this.config.controls.includes("captions")&&n.appendChild(vr.createButton.call(this,"captions")),this.config.controls.includes("settings")&&!hi.empty(this.config.settings)){var s=wi("div",{class:"plyr__menu",hidden:""});s.appendChild(vr.createButton.call(this,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var l=wi("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),c=wi("div"),u=wi("div",{id:"plyr-settings-".concat(e.id,"-home")}),d=wi("div",{role:"menu"});u.appendChild(d),c.appendChild(u),this.elements.settings.panels.home=u,this.config.settings.forEach(function(n){var i=wi("button",Ki(Si(t.config.selectors.buttons.settings),{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--forward"),role:"menuitem","aria-haspopup":!0,hidden:""}));vr.bindMenuItemShortcuts.call(t,i,n),mi(i,"click",function(){vr.showMenuPanel.call(t,n,!1)});var r=wi("span",null,ur(n,t.config)),o=wi("span",{class:t.config.classNames.menu.value});o.innerHTML=e[n],r.appendChild(o),i.appendChild(r),d.appendChild(i);var a=wi("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),s=wi("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});s.appendChild(wi("span",{"aria-hidden":!0},ur(n,t.config))),s.appendChild(wi("span",{class:t.config.classNames.hidden},ur("menuBack",t.config))),mi(a,"keydown",function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),vr.showMenuPanel.call(t,"home",!0))},!1),mi(s,"click",function(){vr.showMenuPanel.call(t,"home",!1)}),a.appendChild(s),a.appendChild(wi("div",{role:"menu"})),c.appendChild(a),t.elements.settings.buttons[n]=i,t.elements.settings.panels[n]=a}),l.appendChild(c),s.appendChild(l),n.appendChild(s),this.elements.settings.popup=l,this.elements.settings.menu=s}if(this.config.controls.includes("pip")&&Hi.pip&&n.appendChild(vr.createButton.call(this,"pip")),this.config.controls.includes("airplay")&&Hi.airplay&&n.appendChild(vr.createButton.call(this,"airplay")),this.config.controls.includes("download")){var h={element:"a",href:this.download,target:"_blank"},f=this.config.urls.download;!hi.url(f)&&this.isEmbed&&Ki(h,{icon:"logo-".concat(this.provider),label:this.provider}),n.appendChild(vr.createButton.call(this,"download",h))}return this.config.controls.includes("fullscreen")&&n.appendChild(vr.createButton.call(this,"fullscreen")),this.config.controls.includes("play-large")&&this.elements.container.appendChild(vr.createButton.call(this,"play-large")),this.elements.controls=n,this.isHTML5&&vr.setQualityMenu.call(this,Ui.getQualityOptions.call(this)),vr.setSpeedMenu.call(this),n},inject:function(){var e=this;if(this.config.loadSprite){var t=vr.getIconUrl.call(this);t.cors&&fr(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;hi.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this.props)),this.config.controls||(this.config.controls=[]),hi.element(this.config.controls)||hi.string(this.config.controls)?n=this.config.controls:(n=vr.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:wr.getLabel.call(this)}),r=!1);var o,a=function(e){var t=e;return Object.entries(i).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t=or(t,"{".concat(i,"}"),r)}),t};if(r&&(hi.string(this.config.controls)?n=a(n):hi.element(n)&&(n.innerHTML=a(n.innerHTML))),hi.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),hi.element(o)||(o=this.elements.container),o[hi.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),hi.element(this.elements.controls)||vr.findElements.call(this),!hi.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return Li(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Ci(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach(function(e){hi.array(e)||hi.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)})}if(window.navigator.userAgent.includes("Edge")&&Di(o),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,d="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),h=Ni.call(this,d);Array.from(h).forEach(function(t){Ci(t,e.config.classNames.hidden,!1),Ci(t,e.config.classNames.tooltip,!0)})}}};function br(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 kr(e){var t=new URLSearchParams;return hi.object(e)&&Object.entries(e).forEach(function(e){var n=nn(e,2),i=n[0],r=n[1];t.set(i,r)}),t}var wr={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Hi.textTracks)hi.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&vr.setCaptionsMenu.call(this);else{var e,t;if(hi.element(this.elements.captions)||(this.elements.captions=wi("div",Si(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,hi.element(e)&&hi.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Vi.isIE&&window.URL){var n=this.media.querySelectorAll("track");Array.from(n).forEach(function(e){var t=e.getAttribute("src"),n=br(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&hr(t,"blob").then(function(t){e.setAttribute("src",window.URL.createObjectURL(t))}).catch(function(){Ei(e)})})}var i=Wi((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map(function(e){return e.split("-")[0]})),r=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===r)r=nn(i,1)[0];var o=this.storage.get("captions");if(hi.boolean(o)||(o=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:o,language:r,languages:i}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";mi.call(this,this.media.textTracks,a,wr.update.bind(this))}setTimeout(wr.update.bind(this),0)}},update:function(){var e=this,t=wr.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find(function(e){return e.language===r}));this.isHTML5&&this.isVideo&&t.filter(function(e){return!o.get(e)}).forEach(function(t){e.debug.log("Track added",t),o.set(t,{default:"showing"===t.mode}),t.mode="hidden",mi.call(e,t,"cuechange",function(){return wr.updateCues.call(e)})}),(s&&this.language!==r||!t.includes(a))&&(wr.setLanguage.call(this,r),wr.toggle.call(this,i&&s)),Ci(this.elements.container,this.config.classNames.captions.enabled,!hi.empty(t)),(this.config.controls||[]).includes("settings")&&this.config.settings.includes("captions")&&vr.setCaptionsMenu.call(this)},toggle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,i=this.config.classNames.captions.active,r=hi.nullOrUndefined(e)?!n:e;if(r!==n){if(t||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!t){var o=wr.getTracks.call(this),a=wr.findTrack.call(this,[this.captions.language].concat(rn(this.captions.languages)),!0);return this.captions.language=a.language,void wr.set.call(this,o.indexOf(a))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),Ci(this.elements.container,i,r),this.captions.toggled=r,vr.updateSetting.call(this,"captions"),vi.call(this,this.media,r?"captionsenabled":"captionsdisabled")}}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=wr.getTracks.call(this);if(-1!==e)if(hi.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=(i||{}).language;this.captions.currentTrackNode=i,vr.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),vi.call(this,this.media,"languagechange")}wr.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&wr.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else wr.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(hi.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=wr.getTracks.call(this),r=wr.findTrack.call(this,[n]);wr.set.call(this,i.indexOf(r),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)})},findTrack:function(e){var t,n=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=wr.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(r).sort(function(e,t){return o(t)-o(e)});return e.every(function(e){return!(t=a.find(function(t){return t.language===e}))}),t||(i?a[0]:void 0)},getCurrentTrack:function(){return wr.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!hi.track(t)&&Hi.textTracks&&this.captions.toggled&&(t=wr.getCurrentTrack.call(this)),hi.track(t)?hi.empty(t.label)?hi.empty(t.language)?ur("enabled",this.config):e.language.toUpperCase():t.label:ur("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(hi.element(this.elements.captions))if(hi.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=wr.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map(function(e){return e.getCueAsHTML()}).map(lr)}var i=t.map(function(e){return e.trim()}).join("\n");if(i!==this.elements.captions.innerHTML){Ai(this.elements.captions);var r=wi("span",Si(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),vi.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},Tr={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!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]},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",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",menuBack:"Go back to previous menu",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:{download:null,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,download: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","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","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"]',download:'[data-plyr="download"]',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",controlPressed:"plyr__control--pressed",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",display:{time:"plyr__time"},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:""}},Er={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Ar={audio:"audio",video:"video"};var _r=function(){},Sr=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Xt(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return en(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):_r}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):_r}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):_r}}]),e}();function Pr(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;hi.element(e)&&(e.pressed=this.active),vi.call(this.player,this.target,this.active?"enterfullscreen":"exitfullscreen",!0),Vi.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(hi.element(e)){var n=Ni.call(this,"button:not(:disabled), input:not(:disabled), [tabindex]"),i=n[0],r=n[n.length-1];pi.call(this,this.elements.container,"keydown",function(e){if("Tab"===e.key&&9===e.keyCode){var t=document.activeElement;t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}},t,!1)}}.call(this.player,this.target,this.active)}}function Cr(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=t?"hidden":"",Ci(this.target,this.player.config.classNames.fullscreen.fallback,t),Vi.isIos){var n=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";n||(n=document.createElement("meta")).setAttribute("name","viewport");var r=hi.string(n.content)&&n.content.includes(i);t?(this.cleanupViewport=!r,r||(n.content+=",".concat(i))):this.cleanupViewport&&(n.content=n.content.split(",").filter(function(e){return e.trim()!==i}).join(",")),setTimeout(function(){return Di(e.target)},100)}Pr.call(this)}var Lr=function(){function e(t){var n=this;Xt(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},mi.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),function(){Pr.call(n)}),mi.call(this.player,this.player.elements.container,"dblclick",function(e){hi.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.toggle()}),this.update()}return en(e,[{key:"update",value:function(){this.enabled?this.player.debug.log("".concat(e.native?"Native":"Fallback"," fullscreen enabled")):this.player.debug.log("Fullscreen not supported and fallback disabled"),Ci(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Vi.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():e.native?this.prefix?hi.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen():Cr.call(this,!0))}},{key:"exit",value:function(){if(this.enabled)if(Vi.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),this.player.play();else if(e.native)if(this.prefix){if(!hi.empty(this.prefix)){var t="moz"===this.prefix?"Cancel":"Exit";document["".concat(this.prefix).concat(t).concat(this.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document);else Cr.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["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement)===this.target:Li(this.target,this.player.config.classNames.fullscreen.fallback))}},{key:"target",get:function(){return Vi.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(hi.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some(function(t){return!(!hi.function(document["".concat(t,"ExitFullscreen")])&&!hi.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)}),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),Mr=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function Nr(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})})}S(S.S,"Math",{sign:Mr});var xr={addStyleHook:function(){Ci(this.elements.container,this.config.selectors.container.replace(".",""),!0),Ci(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 ".concat(this.provider," ").concat(this.type)),void xr.toggleNativeControls.call(this,!0);hi.element(this.elements.controls)||(vr.inject.call(this),this.listeners.controls()),xr.toggleNativeControls.call(this),this.isHTML5&&wr.setup.call(this),this.volume=null,this.muted=null,this.speed=null,this.loop=null,this.quality=null,vr.updateVolume.call(this),vr.timeUpdate.call(this),xr.checkPlaying.call(this),Ci(this.elements.container,this.config.classNames.pip.supported,Hi.pip&&this.isHTML5&&this.isVideo),Ci(this.elements.container,this.config.classNames.airplay.supported,Hi.airplay&&this.isHTML5),Ci(this.elements.container,this.config.classNames.isIos,Vi.isIos),Ci(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(function(){vi.call(e,e.media,"ready")},0),xr.setTitle.call(this),this.poster&&xr.setPoster.call(this,this.poster,!1).catch(function(){}),this.config.duration&&vr.durationUpdate.call(this)},setTitle:function(){var e=ur("play",this.config);if(hi.string(this.config.title)&&!hi.empty(this.config.title)&&(e+=", ".concat(this.config.title)),Array.from(this.elements.buttons.play||[]).forEach(function(t){t.setAttribute("aria-label",e)}),this.isEmbed){var t=xi.call(this,"iframe");if(!hi.element(t))return;var n=hi.empty(this.config.title)?"video":this.config.title,i=ur("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){Ci(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this;return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]||!this.poster?(this.media.setAttribute("poster",e),function(){var e=this;return new Promise(function(t){return e.ready?setTimeout(t,0):mi.call(e,e.elements.container,"ready",t)}).then(function(){})}.call(this).then(function(){return Nr(e)}).catch(function(n){throw e===t.poster&&xr.togglePoster.call(t,!1),n}).then(function(){if(e!==t.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(function(){return Object.assign(t.elements.poster.style,{backgroundImage:"url('".concat(e,"')"),backgroundSize:""}),xr.togglePoster.call(t,!0),e})):Promise.reject(new Error("Poster already set"))},checkPlaying:function(e){var t=this;Ci(this.elements.container,this.config.classNames.playing,this.playing),Ci(this.elements.container,this.config.classNames.paused,this.paused),Ci(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(function(e){e.pressed=t.playing}),hi.event(e)&&"timeupdate"===e.type||xr.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(){Ci(t.elements.container,t.config.classNames.loading,t.loading),xr.toggleControls.call(t)},this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}}},Or=function(){function e(t){Xt(this,e),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}return en(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,o=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&hi.number(i)){if(r){var a=document.activeElement;if(hi.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&Mi(a,s))return;if(32===e.which&&Mi(a,'button, [role^="menuitem"]'))return}switch([32,37,38,39,40,48,49,50,51,52,53,54,56,57,67,70,73,75,76,77,79].includes(i)&&(e.preventDefault(),e.stopPropagation()),i){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:o||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:o||t.togglePlay();break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:o||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:o||t.toggleCaptions();break;case 76:t.loop=!t.loop}!t.fullscreen.enabled&&t.fullscreen.active&&27===i&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){vr.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,Ci(t.container,e.config.classNames.isTouch,!0)}},{key:"setTabFocus",value:function(e){var t=this.player,n=t.elements;if(clearTimeout(this.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(this.lastKeyDown=e.timeStamp);var i,r=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||r)i=t.config.classNames.tabFocus,Ci(Ni.call(t,".".concat(i)),i,!1),this.focusTimer=setTimeout(function(){var e=document.activeElement;n.container.contains(e)&&Ci(document.activeElement,t.config.classNames.tabFocus,!0)},10)}}},{key:"global",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.player;t.config.keyboard.global&&pi.call(t,window,"keydown keyup",this.handleKey,e,!1),pi.call(t,document.body,"click",this.toggleMenu,e),yi.call(t,document.body,"touchstart",this.firstTouch),pi.call(t,document.body,"keydown focus blur",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.elements;!e.config.keyboard.global&&e.config.keyboard.focused&&mi.call(e,t.container,"keydown keyup",this.handleKey,!1),mi.call(e,t.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",function(n){var i=t.controls;i&&"enterfullscreen"===n.type&&(i.pressed=!1,i.hover=!1);var r=0;["touchstart","touchmove","mousemove"].includes(n.type)&&(xr.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(e.timers.controls),e.timers.controls=setTimeout(function(){return xr.toggleControls.call(e,!1)},r)})}},{key:"media",value:function(){var e=this.player,t=e.elements;if(mi.call(e,e.media,"timeupdate seeking seeked",function(t){return vr.timeUpdate.call(e,t)}),mi.call(e,e.media,"durationchange loadeddata loadedmetadata",function(t){return vr.durationUpdate.call(e,t)}),mi.call(e,e.media,"canplay",function(){Pi(t.volume,!e.hasAudio),Pi(t.buttons.mute,!e.hasAudio)}),mi.call(e,e.media,"ended",function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&e.restart()}),mi.call(e,e.media,"progress playing seeking seeked",function(t){return vr.updateProgress.call(e,t)}),mi.call(e,e.media,"volumechange",function(t){return vr.updateVolume.call(e,t)}),mi.call(e,e.media,"playing play pause ended emptied timeupdate",function(t){return xr.checkPlaying.call(e,t)}),mi.call(e,e.media,"waiting canplay seeked playing",function(t){return xr.checkLoading.call(e,t)}),mi.call(e,e.media,"playing",function(){e.ads&&e.ads.enabled&&!e.ads.initialized&&e.ads.managerPromise.then(function(){return e.ads.play()}).catch(function(){return e.play()})}),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=xi.call(e,".".concat(e.config.classNames.video));if(!hi.element(n))return;mi.call(e,t.container,"click",function(i){([t.container,n].includes(i.target)||n.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(e.restart(),e.play()):e.togglePlay()))})}e.supported.ui&&e.config.disableContextMenu&&mi.call(e,t.wrapper,"contextmenu",function(e){e.preventDefault()},!1),mi.call(e,e.media,"volumechange",function(){e.storage.set({volume:e.volume,muted:e.muted})}),mi.call(e,e.media,"ratechange",function(){vr.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),mi.call(e,e.media,"qualitychange",function(t){vr.updateSetting.call(e,"quality",null,t.detail.quality)}),mi.call(e,e.media,"ready qualitychange",function(){vr.setDownloadLink.call(e)});var i=e.config.events.concat(["keyup","keydown"]).join(" ");mi.call(e,e.media,i,function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),vi.call(e,t.container,n.type,!0,r)})}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;hi.function(r)&&(o=r.call(i,e)),o&&hi.function(t)&&t.call(i,e)}},{key:"bind",value:function(e,t,n,i){var r=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[i],l=hi.function(s);mi.call(a,e,t,function(e){return r.proxy(e,n,i)},o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,i=Vi.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach(function(n){e.bind(n,"click",t.togglePlay,"play")}),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",t.rewind,"rewind"),this.bind(n.buttons.fastForward,"click",t.forward,"fastForward"),this.bind(n.buttons.mute,"click",function(){t.muted=!t.muted},"mute"),this.bind(n.buttons.captions,"click",function(){return t.toggleCaptions()}),this.bind(n.buttons.download,"click",function(){vi.call(t,t.media,"download")},"download"),this.bind(n.buttons.fullscreen,"click",function(){t.fullscreen.toggle()},"fullscreen"),this.bind(n.buttons.pip,"click",function(){t.pip="toggle"},"pip"),this.bind(n.buttons.airplay,"click",t.airplay,"airplay"),this.bind(n.buttons.settings,"click",function(e){e.stopPropagation(),vr.toggleMenu.call(t,e)}),this.bind(n.buttons.settings,"keyup",function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),vr.toggleMenu.call(t,e)):vr.focusFirstMenuItem.call(t,null,!0))},null,!1),this.bind(n.settings.menu,"keydown",function(e){27===e.which&&vr.toggleMenu.call(t,e)}),this.bind(n.inputs.seek,"mousedown mousemove",function(e){var t=n.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",i)}),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",function(e){var n=e.currentTarget,i=e.keyCode?e.keyCode:e.which;if(!hi.keyboardEvent(e)||39===i||37===i){t.lastSeekTime=Date.now();var r=n.hasAttribute("play-on-seeked"),o=["mouseup","touchend","keyup"].includes(e.type);r&&o?(n.removeAttribute("play-on-seeked"),t.play()):!o&&t.playing&&(n.setAttribute("play-on-seeked",""),t.pause())}}),Vi.isIos){var r=Ni.call(t,'input[type="range"]');Array.from(r).forEach(function(t){return e.bind(t,i,function(e){return Di(e.target)})})}this.bind(n.inputs.seek,i,function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");hi.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),t.currentTime=i/n.max*t.duration},"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",function(e){return vr.updateSeekTooltip.call(t,e)}),Vi.isWebkit&&Array.from(Ni.call(t,'input[type="range"]')).forEach(function(n){e.bind(n,"input",function(e){return vr.updateRangeFill.call(t,e.target)})}),t.config.toggleInvert&&!hi.element(n.display.duration)&&this.bind(n.display.currentTime,"click",function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,vr.timeUpdate.call(t))}),this.bind(n.inputs.volume,i,function(e){t.volume=e.target.value},"volume"),this.bind(n.controls,"mouseenter mouseleave",function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type}),this.bind(n.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){n.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(n.controls,"focusin",function(){var n=t.config,i=t.elements,r=t.timers;Ci(i.controls,n.classNames.noTransition,!0),xr.toggleControls.call(t,!0),setTimeout(function(){Ci(i.controls,n.classNames.noTransition,!1)},0);var o=e.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout(function(){return xr.toggleControls.call(t,!1)},o)}),this.bind(n.inputs.volume,"wheel",function(e){var n=e.webkitDirectionInvertedFromDevice,i=nn([e.deltaX,-e.deltaY].map(function(e){return n?-e:e}),2),r=i[0],o=i[1],a=Math.sign(Math.abs(r)>Math.abs(o)?r:o);t.increaseVolume(a/50);var s=t.media.volume;(1===a&&s<1||-1===a&&s>0)&&e.preventDefault()},"volume",!1)}}]),e}(),jr=g.f,Ir=Function.prototype,Rr=/^\s*function ([^ (]*)/;"name"in Ir||c&&jr(Ir,"name",{configurable:!0,get:function(){try{return(""+this).match(Rr)[1]}catch(e){return""}}}),at("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]});var Fr=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,d=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!==d(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 Dr(e){return new Promise(function(t,n){Fr(e,{success:t,error:n})})}function qr(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Vr={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Vr.setAspectRatio.call(this),hi.object(window.Vimeo)?Vr.ready.call(this):Dr(this.config.urls.vimeo.sdk).then(function(){Vr.ready.call(e)}).catch(function(t){e.debug.warn("Vimeo API failed to load",t)})},setAspectRatio:function(e){var t=nn((hi.string(e)?e:this.config.ratio).split(":"),2),n=100/t[0]*t[1];if(this.elements.wrapper.style.paddingBottom="".concat(n,"%"),this.supported.ui){var i=(240-n)/4.8;this.media.style.transform="translateY(-".concat(i,"%)")}},ready:function(){var e=this,t=this,n=kr({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");hi.empty(i)&&(i=t.media.getAttribute(t.config.attributes.embed.id));var r,o=(r=i,hi.empty(r)?null:hi.number(Number(r))?r:r.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:r),a=wi("iframe"),s=rr(t.config.urls.vimeo.iframe,o,n);a.setAttribute("src",s),a.setAttribute("allowfullscreen",""),a.setAttribute("allowtransparency",""),a.setAttribute("allow","autoplay");var l=wi("div",{poster:t.poster,class:t.config.classNames.embedContainer});l.appendChild(a),t.media=_i(l,t.media),hr(rr(t.config.urls.vimeo.api,o),"json").then(function(e){if(!hi.empty(e)){var n=new URL(e[0].thumbnail_large);n.pathname="".concat(n.pathname.split("_")[0],".jpg"),xr.setPoster.call(t,n.href).catch(function(){})}}),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 qr.call(t,!0),t.embed.play()},t.media.pause=function(){return qr.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,vi.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,vi.call(t,t.media,"ratechange")}).catch(function(e){"Error"===e.name&&vr.setSpeedMenu.call(t,[])})}});var d=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return d},set:function(e){t.embed.setVolume(e).then(function(){d=e,vi.call(t,t.media,"volumechange")})}});var h=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return h},set:function(e){var n=!!hi.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then(function(){h=n,vi.call(t,t.media,"volumechange")})}});var f,p=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return p},set:function(e){var n=hi.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then(function(){p=n})}}),t.embed.getVideoUrl().then(function(e){f=e,vr.setDownloadLink.call(t)}).catch(function(t){e.debug.warn(t)}),Object.defineProperty(t.media,"currentSrc",{get:function(){return f}}),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"".concat(e/n,":").concat(t/n)}(t[0],t[1]);Vr.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,xr.setTitle.call(e)}),t.embed.getCurrentTime().then(function(e){c=e,vi.call(t,t.media,"timeupdate")}),t.embed.getDuration().then(function(e){t.media.duration=e,vi.call(t,t.media,"durationchange")}),t.embed.getTextTracks().then(function(e){t.media.textTracks=e,wr.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});wr.updateCues.call(t,i)}),t.embed.on("loaded",function(){(t.embed.getPaused().then(function(e){qr.call(t,!e),e||vi.call(t,t.media,"playing")}),hi.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)}),t.embed.on("play",function(){qr.call(t,!0),vi.call(t,t.media,"playing")}),t.embed.on("pause",function(){qr.call(t,!1)}),t.embed.on("timeupdate",function(e){t.media.seeking=!1,c=e.seconds,vi.call(t,t.media,"timeupdate")}),t.embed.on("progress",function(e){t.media.buffered=e.percent,vi.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&vi.call(t,t.media,"canplaythrough"),t.embed.getDuration().then(function(e){e!==t.media.duration&&(t.media.duration=e,vi.call(t,t.media,"durationchange"))})}),t.embed.on("seeked",function(){t.media.seeking=!1,vi.call(t,t.media,"seeked")}),t.embed.on("ended",function(){t.media.paused=!0,vi.call(t,t.media,"ended")}),t.embed.on("error",function(e){t.media.error=e,vi.call(t,t.media,"error")}),setTimeout(function(){return xr.build.call(t)},0)}};function Br(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vi.call(this,this.media,e?"play":"pause"))}var Hr,Ur={setup:function(){var e=this;Ci(this.elements.wrapper,this.config.classNames.embed,!0),Ur.setAspectRatio.call(this),hi.object(window.YT)&&hi.function(window.YT.Player)?Ur.ready.call(this):(Dr(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(){Ur.ready.call(e)}),window.onYouTubeIframeAPIReady=function(){window.onYouTubeReadyCallbacks.forEach(function(e){e()})})},getTitle:function(e){var t=this;if(hi.function(this.embed.getVideoData)){var n=this.embed.getVideoData().title;if(hi.empty(n))return this.config.title=n,void xr.setTitle.call(this)}var i=this.config.keys.google;hi.string(i)&&!hi.empty(i)&&hr(rr(this.config.urls.youtube.api,e,i)).then(function(e){hi.object(e)&&(t.config.title=e.items[0].snippet.title,xr.setTitle.call(t))}).catch(function(){})},setAspectRatio:function(){var e=this.config.ratio.split(":");this.elements.wrapper.style.paddingBottom="".concat(100/e[0]*e[1],"%")},ready:function(){var e=this,t=e.media.getAttribute("id");if(hi.empty(t)||!t.startsWith("youtube-")){var n=e.media.getAttribute("src");hi.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var i,r,o=(i=n,hi.empty(i)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i),a=(r=e.provider,"".concat(r,"-").concat(Math.floor(1e4*Math.random()))),s=wi("div",{id:a,poster:e.poster});e.media=_i(s,e.media);var l=function(e){return"https://img.youtube.com/vi/".concat(o,"/").concat(e,"default.jpg")};Nr(l("maxres"),121).catch(function(){return Nr(l("sd"),121)}).catch(function(){return Nr(l("hq"))}).then(function(t){return xr.setPoster.call(e,t.src)}).then(function(t){t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(function(){}),e.embed=new window.YT.Player(a,{videoId:o,playerVars:{autoplay:e.config.autoplay?1:0,hl:e.config.hl,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(!e.media.error){var n=t.data,i={2:"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.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[n]||"An unknown error occured";e.media.error={code:n,message:i},vi.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),vi.call(e,e.media,"ratechange")},onReady:function(t){if(!hi.function(e.media.play)){var n=t.target;Ur.getTitle.call(e,o),e.media.play=function(){Br.call(e,!0),n.playVideo()},e.media.pause=function(){Br.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.hasPlayed&&e.embed.mute(),e.media.seeking=!0,vi.call(e,e.media,"seeking"),n.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return n.getPlaybackRate()},set:function(e){n.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,n.setVolume(100*i),vi.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var i=hi.boolean(t)?t:r;r=i,n[i?"mute":"unMute"](),vi.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),vi.call(e,e.media,"timeupdate"),vi.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)&&vi.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),vi.call(e,e.media,"canplaythrough"))},200),setTimeout(function(){return xr.build.call(e)},50)}},onStateChange:function(t){var n=t.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(t.data)&&(e.media.seeking=!1,vi.call(e,e.media,"seeked")),t.data){case-1:vi.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),vi.call(e,e.media,"progress");break;case 0:Br.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):vi.call(e,e.media,"ended");break;case 1:e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Br.call(e,!0),vi.call(e,e.media,"playing"),e.timers.playing=setInterval(function(){vi.call(e,e.media,"timeupdate")},50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),vi.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Br.call(e,!1)}vi.call(e,e.elements.container,"statechange",!1,{code:t.data})}}})}}},Wr={setup:function(){this.media?(Ci(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),Ci(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&Ci(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=wi("div",{class:this.config.classNames.video}),bi(this.media,this.elements.wrapper),this.elements.poster=wi("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ui.extend.call(this):this.isYouTube?Ur.setup.call(this):this.isVimeo&&Vr.setup.call(this)):this.debug.warn("No media element found!")}},zr=function(){function e(t){var n=this;Xt(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 en(e,[{key:"load",value:function(){var e=this;this.enabled&&(hi.object(window.google)&&hi.object(window.google.ima)?this.ready():Dr(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=wi("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=yr(Math.max(e.manager.getRemainingTime(),0)),n="".concat(ur("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)},100)}},{key:"onAdsManagerLoaded",value:function(e){var t=this;if(this.enabled){var n=new google.ima.AdsRenderingSettings;n.restoreCustomPlaybackStateOnAdBreakComplete=!0,n.enablePreloading=!0,this.manager=e.getAdsManager(this.player,n),this.cuePoints=this.manager.getCuePoints(),hi.empty(this.cuePoints)||this.cuePoints.forEach(function(e){if(0!==e&&-1!==e&&e<t.player.duration){var n=t.player.elements.progress;if(hi.element(n)){var i=100/t.player.duration*e,r=wi("span",{class:t.player.config.classNames.cues});r.style.left="".concat(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".concat(e.replace(/_/g,"").toLowerCase());vi.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,t=this,n=this.player.elements.container;this.player.on("ended",function(){t.loader.contentComplete()}),this.player.on("seeking",function(){return e=t.player.currentTime}),this.player.on("seeked",function(){var n=t.player.currentTime;hi.empty(t.cuePoints)||t.cuePoints.forEach(function(i,r){e<i&&i<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(r,1))})}),window.addEventListener("resize",function(){t.manager&&t.manager.resize(n.offsetWidth,n.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=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];var o=this.events[e];hi.array(o)&&o.forEach(function(e){hi.function(e)&&e.apply(t,i)})}},{key:"on",value:function(e,t){return hi.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: ".concat(t)),this.safetyTimer=setTimeout(function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")},e)}},{key:"clearSafetyTimer",value:function(e){hi.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.ads.enabled&&!hi.empty(this.publisherId)}},{key:"tagUrl",get:function(){var e={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:this.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(kr(e))}}]),e}(),Kr={insertElements:function(e,t){var n=this;hi.string(t)?Ti(e,this.media,{src:t}):hi.array(t)&&t.forEach(function(t){Ti(e,n.media,t)})},change:function(e){var t=this;zi(e,"sources.length")?(Ui.cancelRequests.call(this),this.destroy.call(this,function(){t.options.quality=[],Ei(t.media),t.media=null,hi.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=nn(n,1)[0],o=r.provider,a=void 0===o?Er.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:Hi.check(i,a,t.config.playsinline),media:wi(l,c)}),t.elements.container.appendChild(t.media),hi.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),hi.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","")),xr.addStyleHook.call(t),t.isHTML5&&Kr.insertElements.call(t,"source",n),t.config.title=e.title,Wr.setup.call(t),t.isHTML5&&("tracks"in e&&Kr.insertElements.call(t,"track",e.tracks),t.media.load()),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&xr.build.call(t),t.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}},Yr=function(){function e(t,n){var i=this;if(Xt(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Hi.touch,this.media=t,hi.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||hi.nodeList(this.media)||hi.array(this.media))&&(this.media=this.media[0]),this.config=Ki({},Tr,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new Sr(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Hi),!hi.nullOrUndefined(this.media)&&hi.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Hi.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"),hi.element(a)){if(s=br(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/.test(e)?Er.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Er.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.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.hl=s.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(hi.empty(this.provider)||!Object.keys(Er).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=Ar.video;break;case"video":case"audio":this.type=o,this.provider=Er.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-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=Hi.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Or(this),this.storage=new dr(this),this.media.plyr=this,hi.element(this.elements.container)||(this.elements.container=wi("div"),bi(this.media,this.elements.container)),xr.addStyleHook.call(this),Wr.setup.call(this),this.config.debug&&mi.call(this,this.elements.container,this.config.events.join(" "),function(e){i.debug.log("event: ".concat(e.type))}),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&xr.build.call(this),this.listeners.container(),this.listeners.global(),this.fullscreen=new Lr(this),this.config.ads.enabled&&(this.ads=new zr(this)),this.config.autoplay&&this.play(),this.lastSeekTime=0):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 en(e,[{key:"play",value:function(){return hi.function(this.media.play)?this.media.play():null}},{key:"pause",value:function(){this.playing&&hi.function(this.media.pause)&&this.media.pause()}},{key:"togglePlay",value:function(e){(hi.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):hi.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime=this.currentTime-(hi.number(e)?e:this.config.seekTime)}},{key:"forward",value:function(e){this.currentTime=this.currentTime+(hi.number(e)?e:this.config.seekTime)}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(hi.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){wr.toggle.call(this,e,!1)}},{key:"airplay",value:function(){Hi.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=Li(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=Ci(this.elements.container,this.config.classNames.hideControls,n);if(i&&this.config.controls.includes("settings")&&!hi.empty(this.config.settings)&&vr.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";vi.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){mi.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){yi.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){gi(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&&(Ei(t.elements.buttons.play),Ei(t.elements.captions),Ei(t.elements.controls),Ei(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),hi.function(e)&&e()):(function(){this&&this.eventListeners&&(this.eventListeners.forEach(function(e){var t=e.element,n=e.type,i=e.callback,r=e.options;t.removeEventListener(n,i,r)}),this.eventListeners=[])}.call(t),_i(t.elements.original,t.elements.container),vi.call(t,t.elements.original,"destroyed",!0),hi.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout(function(){t.elements=null,t.media=null},200))};this.stop(),this.isHTML5?(clearTimeout(this.timers.loading),xr.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&hi.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}}},{key:"supports",value:function(e){return Hi.mime.call(this,e)}},{key:"isHTML5",get:function(){return Boolean(this.provider===Er.html5)}},{key:"isEmbed",get:function(){return Boolean(this.isYouTube||this.isVimeo)}},{key:"isYouTube",get:function(){return Boolean(this.provider===Er.youtube)}},{key:"isVimeo",get:function(){return Boolean(this.provider===Er.vimeo)}},{key:"isVideo",get:function(){return Boolean(this.type===Ar.video)}},{key:"isAudio",get:function(){return Boolean(this.type===Ar.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=hi.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log("Seeking to ".concat(this.currentTime," seconds"))}},get:function(){return Number(this.media.currentTime)}},{key:"buffered",get:function(){var e=this.media.buffered;return hi.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,n=hi.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;hi.string(t)&&(t=Number(t)),hi.number(t)||(t=this.storage.get("volume")),hi.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!hi.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;hi.boolean(t)||(t=this.storage.get("muted")),hi.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;hi.number(e)&&(t=e),hi.number(t)||(t=this.storage.get("speed")),hi.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 (".concat(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=[!hi.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(hi.number);if(!n.includes(i)){var r=function(e,t){return hi.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: ".concat(i,", using ").concat(r," instead")),i=r}t.selected=i,this.media.quality=i}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=hi.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){Kr.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return hi.url(e)?e:this.source}},{key:"poster",set:function(e){this.isVideo?xr.setPoster.call(this,e,!1).catch(function(){}):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=hi.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){wr.set.call(this,e,!1)},get:function(){var e=this.captions,t=e.toggled,n=e.currentTrack;return t?n:-1}},{key:"language",set:function(e){wr.setLanguage.call(this,e,!1)},get:function(){return(wr.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){var t="picture-in-picture",n="inline";if(Hi.pip){var i=hi.boolean(e)?e:this.pip===n;this.media.webkitSetPresentationMode(i?t:n)}},get:function(){return Hi.pip?this.media.webkitPresentationMode:null}}],[{key:"supported",value:function(e,t,n){return Hi.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return fr(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return hi.string(t)?i=Array.from(document.querySelectorAll(t)):hi.nodeList(t)?i=Array.from(t):hi.array(t)&&(i=t.filter(hi.element)),hi.empty(i)?null:i.map(function(t){return new e(t,n)})}}]),e}();return Yr.defaults=(Hr=Tr,JSON.parse(JSON.stringify(Hr))),Yr}); //# sourceMappingURL=plyr.polyfilled.min.js.map diff --git a/dist/plyr.polyfilled.min.js.map b/dist/plyr.polyfilled.min.js.map index 3a39679e..98247942 100644 --- a/dist/plyr.polyfilled.min.js.map +++ b/dist/plyr.polyfilled.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","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/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.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/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.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/_string-ws.js","node_modules/core-js/modules/_string-trim.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/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.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.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_invoke.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/_user-agent.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","src/js/utils/loadImage.js","node_modules/core-js/modules/es6.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","detail","undefined","document","createEvent","initCustomEvent","call","this","Object","defineProperty","get","prototype","Event","global","iteratorSupported","Symbol","iterator","error","checkIfIteratorIsSupported","createIterator","items","next","value","shift","done","serializeParam","encodeURIComponent","replace","deserializeParam","decodeURIComponent","URLSearchParams","toString","searchString","writable","_fromString","_this","forEach","name","append","proto","_entries","push","delete","getAll","slice","has","set","callback","thisArg","entries","hasOwnProperty","i","length","keys","values","searchArray","join","enumerable","configurable","attribute","attributes","split","polyfillURLSearchParams","sort","a","b","self","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","String","baseElement","doc","location","implementation","createHTMLDocument","createElement","head","appendChild","indexOf","err","anchorElement","body","protocol","test","TypeError","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","apply","arguments","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","defineProperties","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","_aFunction","it","_ctx","fn","that","aFunction","c","module","exports","Math","Function","__g","core","version","__e","_isObject","_anObject","isObject","_fails","exec","_descriptors","require$$0","is","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","val","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","_propertyDesc","bitmap","_hide","object","key","f","createDesc","_has","id","px","random","_uid","concat","SRC","$toString","TPL","inspectSource","safe","isFunction","hide","$export","type","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","_export","_defined","_toObject","defined","_iterCall","ret","_iterators","store","mode","copyright","USE_SYMBOL","uid","ITERATOR","ArrayProto","Array","_isArrayIter","Iterators","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_createProperty","index","$defineProperty","_cof","TAG","ARG","cof","_classof","T","tryGet","callee","core_getIteratorMethod","getIteratorMethod","classof","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","from","arrayLike","result","step","toObject","C","aLen","mapfn","mapping","iterFn","getIterFn","isArrayIter","toLength","createProperty","_iobject","propertyIsEnumerable","_isArray","isArray","arg","SPECIES","_arraySpeciesCreate","original","constructor","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","asc","$this","callbackfn","res","IObject","UNSCOPABLES","_addToUnscopables","$find","forced","find","_toIobject","gOPD","getOwnPropertyDescriptor","toIObject","pIE","check","setPrototypeOf","buggy","__proto__","_inheritIfRequired","max","_arrayIncludes","IS_INCLUDES","el","fromIndex","toAbsoluteIndex","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_stringWs","space","spaces","ltrim","RegExp","rtrim","exporter","KEY","ALIAS","FORCE","fails","trim","string","_stringTrim","_objectKeys","enumBugKeys","_objectDps","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","src","contentWindow","open","write","lt","close","_objectCreate","dPs","gOPN","$trim","require$$3","$Number","Base","BROKEN_COF","require$$4","TRIM","toNumber","argument","third","radix","maxCode","first","charCodeAt","NaN","code","digits","l","parseInt","inheritIfRequired","require$$5","j","require$$6","MATCH","_isRegexp","isRegExp","_stringContext","NAME","_failsIsRegexp","re","includes","context","$includes","_fixReWks","SYMBOL","wks","fns","strfn","rxfn","SEARCH","$search","regexp","_flags","ignoreCase","multiline","unicode","sticky","flags","define","DESCRIPTORS","$flags","_iterStep","def","_setToStringTag","tag","stat","IteratorPrototype","_iterCreate","Constructor","descriptor","setToStringTag","ObjectProto","_objectGpo","getPrototypeOf","BUGGY","returnThis","_iterDefine","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","es6_array_iterator","iterated","_t","_i","_k","Arguments","addToUnscopables","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","$iterators","$at","TO_STRING","pos","s","charAt","point","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","k","getSymbols","gOPS","isEnum","_redefineAll","_anInstance","forbiddenField","BREAK","RETURN","iterable","_validateCollection","arrayFind","createArrayMethod","arrayFindIndex","uncaughtFrozenStore","_l","UncaughtFrozenStore","findUncaughtFrozen","entry","splice","_collectionWeak","getConstructor","wrapper","ADDER","anInstance","forOf","redefineAll","data","validate","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","$iterDetect","BUGGY_ZERO","$instance","clear","setStrong","freeze","_f","SPLIT","$split","_split","$push","NPCG","separator","limit","separator2","match","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","_objectToArray","isEntries","$values","REPLACE","$replace","searchValue","replaceValue","defer","channel","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","args","un","invoke","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","v","navigator","_userAgent","userAgent","_setSpecies","task","microtask","last","notify","flush","parent","domain","exit","enter","standalone","then","toggle","node","createTextNode","observe","characterData","versions","v8","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","_a","onrejectionhandled","$reject","_d","_w","$resolve","executor","onFulfilled","onRejected","D","catch","r","capability","x","promiseCapability","promiseResolve","require$$7","all","remaining","$index","alreadyCalled","race","$startsWith","startsWith","number","input","instanceOf","Boolean","isNullOrUndefined","isString","isNodeList","isEmpty","is$1","nullOrUndefined","Number","boolean","function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","passive","capture","events","eventListeners","on","off","once","onceCallback","_len","_key","triggerEvent","plyr","dispatchEvent","wrap","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","filter","_ref","_slicedToArray","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","range","browser","isIE","documentMode","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","getAttribute","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","getDeep","path","reduce","obj","sources","_defineProperty","$RegExp","re1","re2","CORRECT_NEW","p","tiRE","piRE","fiU","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","content","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","button","control","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","inject","_this10","props","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","setup","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","urls","vimeo","sdk","youtube","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","onChange","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","scrollX","y","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","_mathSign","sign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","isEmbed","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","rect","currentTarget","hasAttribute","seekTo","isFocusIn","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","FProto","nameRE","$match","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","Date","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\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(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\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})();\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', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\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(name, value);\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) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\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) {\r\n items.push([name, value]);\r\n });\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 searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\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 });\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 if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\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 // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\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 // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\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 if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\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']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\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 this._updateSearchParams();\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\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","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","// 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.7' };\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","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","// 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","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\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","module.exports = {};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\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","// 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","// 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","'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","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\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","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","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","'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","// 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.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","'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","exports.f = {}.propertyIsEnumerable;\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 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","// 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","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 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","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\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","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\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.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","// 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.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// 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","'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","// @@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';\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';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\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 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","// 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","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\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 = $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 && typeof IteratorPrototype[ITERATOR] != 'function') 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 $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","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 $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\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","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","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","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 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 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 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","// 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","// @@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","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 $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-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","// @@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","// 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","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","// 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","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 // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\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 userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\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')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\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, exited;\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); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\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 if (domain && !exited) domain.exit();\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 global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\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","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","// 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","// 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","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './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(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 // Skip i18n for abbreviations and brand names\n const universals = {\n pip: 'PIP',\n airplay: 'AirPlay',\n };\n const text = universals[type] || i18n.get(type, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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(\n controls.createIcon.call(this, iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, label, {\n class: 'label--not-pressed',\n }),\n );\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\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:\n '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\n // Quality\n 'qualitychange',\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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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","// 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","// ==========================================================================\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","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Focus in/out on controls\n this.bind(elements.controls, 'focusin focusout', event => {\n const { config, elements, timers } = player;\n const isFocusIn = event.type === 'focusin';\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, isFocusIn);\n\n // Toggle\n ui.toggleControls.call(player, isFocusIn);\n\n // If focusin, hide again after delay\n if (isFocusIn) {\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\n // Hide\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n }\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\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","// @@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","(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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = 100 / x * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.4\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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/custom-event-polyfill/polyfill.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_ctx.js","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/_export.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_iter-call.js","node_modules/core-js/modules/_iterators.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/_is-array-iter.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_create-property.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/core.get-iterator-method.js","node_modules/core-js/modules/_iter-detect.js","node_modules/core-js/modules/es6.array.from.js","node_modules/core-js/modules/_iobject.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/es6.array.find.js","node_modules/core-js/modules/_object-pie.js","node_modules/core-js/modules/_to-iobject.js","node_modules/core-js/modules/_object-gopd.js","node_modules/core-js/modules/_set-proto.js","node_modules/core-js/modules/_inherit-if-required.js","node_modules/core-js/modules/_to-absolute-index.js","node_modules/core-js/modules/_array-includes.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/_string-ws.js","node_modules/core-js/modules/_string-trim.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/es6.number.constructor.js","node_modules/core-js/modules/_object-sap.js","node_modules/core-js/modules/es6.object.keys.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.includes.js","node_modules/core-js/modules/es7.array.includes.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/es6.regexp.search.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/es6.regexp.flags.js","node_modules/core-js/modules/es6.regexp.to-string.js","node_modules/core-js/modules/_iter-step.js","node_modules/core-js/modules/_set-to-string-tag.js","node_modules/core-js/modules/_iter-create.js","node_modules/core-js/modules/_object-gpo.js","node_modules/core-js/modules/_iter-define.js","node_modules/core-js/modules/es6.array.iterator.js","node_modules/core-js/modules/web.dom.iterable.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/es6.string.iterator.js","node_modules/core-js/modules/_meta.js","node_modules/core-js/modules/_object-gops.js","node_modules/core-js/modules/_object-assign.js","node_modules/core-js/modules/_redefine-all.js","node_modules/core-js/modules/_an-instance.js","node_modules/core-js/modules/_for-of.js","node_modules/core-js/modules/_validate-collection.js","node_modules/core-js/modules/_collection-weak.js","node_modules/core-js/modules/es6.weak-map.js","node_modules/core-js/modules/_collection.js","node_modules/core-js/modules/es6.object.assign.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/_object-to-array.js","node_modules/core-js/modules/es7.object.entries.js","node_modules/core-js/modules/es7.object.values.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_task.js","node_modules/core-js/modules/_invoke.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/_user-agent.js","node_modules/core-js/modules/_set-species.js","node_modules/core-js/modules/_promise-resolve.js","node_modules/core-js/modules/es6.string.starts-with.js","node_modules/core-js/modules/es6.number.is-nan.js","src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","node_modules/core-js/modules/es6.regexp.constructor.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/modules/_math-sign.js","src/js/utils/loadImage.js","node_modules/core-js/modules/es6.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es6.function.name.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","detail","undefined","document","createEvent","initCustomEvent","call","this","Object","defineProperty","get","prototype","Event","global","iteratorSupported","Symbol","iterator","error","checkIfIteratorIsSupported","createIterator","items","next","value","shift","done","serializeParam","encodeURIComponent","replace","deserializeParam","decodeURIComponent","URLSearchParams","toString","searchString","writable","_fromString","_this","forEach","name","append","proto","_entries","push","delete","getAll","slice","has","set","callback","thisArg","entries","hasOwnProperty","i","length","keys","values","searchArray","join","enumerable","configurable","attribute","attributes","split","polyfillURLSearchParams","sort","a","b","self","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","String","baseElement","doc","location","implementation","createHTMLDocument","createElement","head","appendChild","indexOf","err","anchorElement","body","protocol","test","TypeError","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","apply","arguments","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","defineProperties","origin","expectedPort","http:","https:","ftp:","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","_aFunction","it","_ctx","fn","that","aFunction","c","module","exports","Math","Function","__g","core","version","__e","_isObject","_anObject","isObject","_fails","exec","_descriptors","require$$0","is","_domCreate","_ie8DomDefine","require$$1","require$$2","_toPrimitive","S","val","valueOf","dP","O","P","Attributes","anObject","toPrimitive","IE8_DOM_DEFINE","_propertyDesc","bitmap","_hide","object","key","f","createDesc","_has","id","px","random","_uid","concat","SRC","$toString","TPL","inspectSource","safe","isFunction","hide","$export","type","source","own","out","exp","IS_FORCED","F","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","target","expProto","ctx","redefine","U","W","R","_export","_defined","_toObject","defined","_iterCall","ret","_iterators","store","mode","copyright","USE_SYMBOL","uid","ITERATOR","ArrayProto","Array","_isArrayIter","Iterators","ceil","floor","_toInteger","isNaN","min","_toLength","toInteger","_createProperty","index","$defineProperty","_cof","TAG","ARG","cof","_classof","T","tryGet","callee","core_getIteratorMethod","getIteratorMethod","classof","SAFE_CLOSING","_iterDetect","skipClosing","arr","iter","from","arrayLike","result","step","toObject","C","aLen","mapfn","mapping","iterFn","getIterFn","isArrayIter","toLength","createProperty","_iobject","propertyIsEnumerable","_isArray","isArray","arg","SPECIES","_arraySpeciesCreate","original","constructor","_arrayMethods","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","asc","$this","callbackfn","res","IObject","UNSCOPABLES","_addToUnscopables","$find","forced","find","_toIobject","gOPD","getOwnPropertyDescriptor","toIObject","pIE","check","setPrototypeOf","buggy","__proto__","_inheritIfRequired","max","_arrayIncludes","IS_INCLUDES","el","fromIndex","toAbsoluteIndex","shared","_sharedKey","arrayIndexOf","IE_PROTO","_objectKeysInternal","names","_enumBugKeys","hiddenKeys","getOwnPropertyNames","$keys","_stringWs","space","spaces","ltrim","RegExp","rtrim","exporter","KEY","ALIAS","FORCE","fails","trim","string","_stringTrim","_objectKeys","enumBugKeys","_objectDps","Properties","getKeys","_html","documentElement","Empty","createDict","iframeDocument","iframe","style","display","src","contentWindow","open","write","lt","close","_objectCreate","dPs","gOPN","$trim","require$$3","$Number","Base","BROKEN_COF","require$$4","TRIM","toNumber","argument","third","radix","maxCode","first","charCodeAt","NaN","code","digits","l","parseInt","inheritIfRequired","require$$5","j","require$$6","MATCH","_isRegexp","isRegExp","_stringContext","NAME","_failsIsRegexp","re","includes","context","$includes","_fixReWks","SYMBOL","wks","fns","strfn","rxfn","SEARCH","$search","regexp","_flags","ignoreCase","multiline","unicode","sticky","flags","define","DESCRIPTORS","$flags","_iterStep","def","_setToStringTag","tag","stat","IteratorPrototype","_iterCreate","Constructor","descriptor","setToStringTag","ObjectProto","_objectGpo","getPrototypeOf","BUGGY","returnThis","_iterDefine","DEFAULT","IS_SET","FORCED","$iterCreate","methods","getMethod","kind","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","es6_array_iterator","iterated","_t","_i","_k","Arguments","addToUnscopables","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","$iterators","$at","TO_STRING","pos","s","charAt","point","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","w","meta","NEED","fastKey","getWeak","onFreeze","getOwnPropertySymbols","$assign","assign","_objectAssign","A","K","k","getSymbols","gOPS","isEnum","_redefineAll","_anInstance","forbiddenField","BREAK","RETURN","iterable","_validateCollection","arrayFind","createArrayMethod","arrayFindIndex","uncaughtFrozenStore","_l","UncaughtFrozenStore","findUncaughtFrozen","entry","splice","_collectionWeak","getConstructor","wrapper","ADDER","anInstance","forOf","redefineAll","data","validate","$has","ufstore","InternalMap","each","weak","tmp","$WeakMap","common","IS_WEAK","fixMethod","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","$iterDetect","BUGGY_ZERO","$instance","clear","setStrong","freeze","_f","SPLIT","$split","_split","$push","NPCG","separator","limit","separator2","match","lastIndex","lastLength","output","lastLastIndex","splitLimit","separatorCopy","_objectToArray","isEntries","$values","REPLACE","$replace","searchValue","replaceValue","defer","channel","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","run","listener","args","un","invoke","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","v","navigator","_userAgent","userAgent","_setSpecies","task","microtask","last","notify","flush","parent","domain","exit","enter","standalone","then","toggle","node","createTextNode","observe","characterData","versions","v8","$Promise","empty","newPromiseCapability","newPromiseCapabilityModule","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_n","chain","_c","_v","ok","_s","reaction","exited","handler","fail","_h","onHandleUnhandled","onUnhandled","console","unhandled","isUnhandled","perform","emit","onunhandledrejection","reason","_a","onrejectionhandled","$reject","_d","_w","$resolve","executor","onFulfilled","onRejected","D","catch","r","capability","x","promiseCapability","promiseResolve","require$$7","all","remaining","$index","alreadyCalled","race","$startsWith","startsWith","number","input","instanceOf","Boolean","isNullOrUndefined","isString","isNodeList","isEmpty","is$1","nullOrUndefined","Number","boolean","function","array","weakMap","WeakMap","nodeList","element","Element","textNode","Text","keyboardEvent","KeyboardEvent","cue","TextTrackCue","VTTCue","track","TextTrack","supportsPassiveListeners","supported","options","removeEventListener","toggleListener","passive","capture","events","eventListeners","on","off","once","onceCallback","_len","_key","triggerEvent","plyr","dispatchEvent","wrap","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","filter","_ref","_slicedToArray","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","parts","class","toggleHidden","hidden","removeAttribute","toggleClass","force","map","classList","contains","hasClass","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelectorAll","getElements","container","getElement","querySelector","setFocus","tabFocus","focus","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","offsetHeight","range","browser","isIE","documentMode","isWebkit","isIPhone","platform","isIos","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","html5","getSources","getAttribute","getQualityOptions","extend","player","_player$media","currentTime","paused","preload","readyState","play","load","quality","storage","cancelRequests","blankVideo","debug","log","dedupe","item","getDeep","path","reduce","obj","sources","_defineProperty","$RegExp","re1","re2","CORRECT_NEW","p","tiRE","piRE","fiU","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","resources","vimeo","youtube","i18n","{seektime}","seekTime","{title}","title","_ref2","Storage","_classCallCheck","enabled","localStorage","getItem","json","JSON","parse","setItem","stringify","removeItem","fetch","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","content","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","role","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","control","button","createRange","autocomplete","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","aria-hidden","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_this2","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","listeners","bind","currentTrack","speed","parseFloat","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this3","current","toFixed","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this4","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this5","checkMenu","sorting","getBadge","setCaptionsMenu","_this6","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this7","isVimeo","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","_this8","size","restore","propertyName","setDownloadLink","download","_this9","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this10","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","parser","buildUrlParams","setup","isVideo","isYouTube","languages","userLanguage","active","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","_toConsumableArray","embed","enableTextTrack","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","reset","disabled","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","providers","types","noop","Console","onChange","keyCode","activeElement","shiftKey","toggleFallback","scrollPosition","scrollX","y","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","Fullscreen","prefix","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","_mathSign","sign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","ready","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","rect","currentTarget","hasAttribute","seekTo","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","FProto","nameRE","$match","factory","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","publish","bundleId","pathsNotFound","q","executeCallbacks","depsNotFound","success","loadFile","callbackFn","numTries","isCss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","rel","onbeforeload","ev","sheet","cssText","loadjs","paths","arg1","arg2","numWaiting","loadFiles","deps","bundleIds","subscribe","isDefined","loadScript","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","_split2","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","$2","thumbnail_large","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","getRatio","h","getAspectRatio","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","firstChild","getPaused","seconds","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","snippet","currentId","posterSrc","playerVars","hl","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","2","5","100","101","150","onPlaybackRateChange","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","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","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","_this11","handlers","_this12","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","insertElements","change","_sources$","_sources$$provider","tagName","crossorigin","Plyr","failed","jQuery","getProviderByUrl","truthy","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","prev","curr","closest","states","webkitPresentationMode","inline","t"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["// Polyfill for creating CustomEvents on IE9/10/11\n\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n(function() {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', { cancelable: true });\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(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\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})();\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', { writable: true, value: {} });\r\n\r\n if (typeof searchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\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(name, value);\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) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\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) {\r\n items.push([name, value]);\r\n });\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 searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n this._entries = {};\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 });\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 if (typeof URLSearchParams.prototype.sort !== 'function') {\r\n URLSearchParams.prototype.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\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 // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\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 // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\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 if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\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']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\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 this._updateSearchParams();\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\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","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","// 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.7' };\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","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","// 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","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\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","module.exports = {};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\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","// 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","// 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","'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","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\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","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","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","'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","// 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.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","'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","exports.f = {}.propertyIsEnumerable;\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 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","// 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","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 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","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\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","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\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.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","// 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.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// 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","'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","// @@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';\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';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\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 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","// 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","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\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 = $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 && typeof IteratorPrototype[ITERATOR] != 'function') 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 $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","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 $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\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","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","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","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 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 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 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","// 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","// @@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","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 $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-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","// @@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","// 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","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","// 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","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 // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\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 userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\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')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\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, exited;\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); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\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 if (domain && !exited) domain.exit();\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 global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\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","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","// 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","// 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","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n url: isUrl,\n empty: isEmpty,\n};\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(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[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.call(this, element, events, onceCallback, true, passive, capture);\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 { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(\n resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } 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 // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\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 if (!is.element(element) || !is.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n\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 if (!is.element(element)) {\n return;\n }\n\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.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.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\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 false;\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 =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n 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// 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 = document.activeElement;\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 toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus();\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\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 try {\n toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n toggleHidden(element, false);\n } catch (e) {\n // Do nothing\n }\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// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\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 const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\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(inputType) {\n const [mediaType] = inputType.split('/');\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n let type;\n if (inputType && inputType.includes('codecs=')) {\n // Use input directly\n type = inputType;\n } else if (inputType === 'audio/mpeg') {\n // Skip codec\n type = 'audio/mpeg;';\n } else if (inputType in defaultCodecs) {\n // Use codec\n type = `${inputType}; codecs=\"${defaultCodecs[inputType]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (err) {\n return false;\n }\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.find(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, paused, preload, readyState } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n player.play();\n }\n });\n\n // Load new source\n player.media.load();\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n\n // Save to storage\n player.storage.set({ quality: input });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\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// 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","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\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) => args[i].toString());\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(\n new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n replace.toString(),\n );\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 './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([key, value]) => {\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// 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.status);\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// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\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 && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\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, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\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\n// TODO: Don't export a massive object - break down and create class\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\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(\n `.${this.config.classNames.tooltip}`,\n );\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n\n const attributes = Object.assign({}, attr, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\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 attributes = Object.assign({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach(key => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\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 props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 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-label': i18n.get(type, this.config),\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 input;\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 const suffixKey = {\n played: 'played',\n buffer: 'buffered',\n }[type];\n const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\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: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\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 // Bind keyboard shortcuts for a menu item\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n bindMenuItemShortcuts(menuItem, type) {\n // Navigate through menus via arrow keys and space\n on(\n menuItem,\n 'keydown keyup',\n event => {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n }\n\n // Prevent play / seek\n event.preventDefault();\n event.stopPropagation();\n\n // We're just here to prevent the keydown bubbling\n if (event.type === 'keydown') {\n return;\n }\n\n const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n // Show the respective menu\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(this, type, true);\n } else {\n let target;\n\n if (event.which !== 32) {\n if (event.which === 40 || (isRadioButton && event.which === 39)) {\n target = menuItem.nextElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(this, target, true);\n }\n }\n },\n false,\n );\n\n // Enter will fire a `click` event but we still need to manage focus\n // So we bind to keyup which fires after and set focus here\n on(menuItem, 'keyup', event => {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(this, null, true);\n });\n },\n\n // Create a settings menu item\n createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n const menuItem = createElement(\n 'button',\n extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n 'aria-checked': checked,\n value,\n }),\n );\n\n const flex = createElement('span');\n\n // We have to set as HTML incase of special characters\n flex.innerHTML = title;\n\n if (is.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex);\n\n // Replicate radio button behaviour\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set(checked) {\n // Ensure exclusivity\n if (checked) {\n Array.from(menuItem.parentNode.children)\n .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n .forEach(node => node.setAttribute('aria-checked', 'false'));\n }\n\n menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n },\n });\n\n this.listeners.bind(\n menuItem,\n 'click keyup',\n event => {\n if (is.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n this.currentTrack = Number(value);\n break;\n\n case 'quality':\n this.quality = value;\n break;\n\n case 'speed':\n this.speed = parseFloat(value);\n break;\n\n default:\n break;\n }\n\n controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n },\n type,\n false,\n );\n\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n list.appendChild(menuItem);\n },\n\n // Format a time for display\n formatTime(time = 0, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return time;\n }\n\n // Always display hours if duration is over an hour\n const forceHours = getHours(this.duration) > 0;\n\n return formatTime(time, forceHours, inverted);\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 // eslint-disable-next-line no-param-reassign\n target.innerText = controls.formatTime(time, 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 this.elements.buttons.mute.pressed = 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 values for https://github.com/sampotts/plyr/issues/905\n if (matches(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n const currentTime = controls.formatTime(this.currentTime);\n const duration = controls.formatTime(this.duration);\n const format = i18n.get('seekLabel', this.config);\n range.setAttribute(\n 'aria-valuetext',\n format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n );\n } else if (matches(range, this.config.selectors.inputs.volume)) {\n const percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n } else {\n range.setAttribute('aria-valuenow', range.value);\n }\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 (\n !this.config.tooltips.seek ||\n !is.element(this.elements.inputs.seek) ||\n !is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\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) && ['mouseenter', 'mouseleave'].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(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\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 duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\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 // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\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 // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.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 // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\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 = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\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.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, tabFocus);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is.event(input)) {\n const isMenuItem = popup.contains(input.target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n\n // Set the download link\n setDownloadLink() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set download link\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\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 progress.appendChild(\n controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\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 // Volume controls\n if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n const volume = createElement('div', {\n class: 'plyr__volume',\n });\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n volume.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n controls.createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n\n this.elements.volume = volume;\n }\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 control = createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n control.appendChild(\n controls.createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\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 role: 'menuitem',\n 'aria-haspopup': true,\n hidden: '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on(menuItem, 'click', () => {\n controls.showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\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 flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on(\n pane,\n 'keydown',\n event => {\n // We only care about <-\n if (event.which !== 37) {\n return;\n }\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n controls.showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on(backButton, 'click', () => {\n controls.showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n control.appendChild(popup);\n container.appendChild(control);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = control;\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 // Download button\n if (this.config.controls.includes('download')) {\n const attributes = {\n element: 'a',\n href: this.download,\n target: '_blank',\n };\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(controls.createButton.call(this, 'download', attributes));\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 // Set available quality levels\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 function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this.props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\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 (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n};\n\nexport default controls;\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 const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\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 (\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n this.config.settings.includes('captions')\n ) {\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 (\n url !== null &&\n url.hostname !== window.location.href.hostname &&\n ['http:', 'https:'].includes(url.protocol)\n ) {\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 // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n // 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 // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n 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 // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\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 = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ 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 // Show captions\n captions.toggle.call(this, true, passive);\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\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\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\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(track => track.language === language);\n return !track; // Break iteration if there is a match\n });\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\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.toggled) {\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 // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: 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: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\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: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\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 // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\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 seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/v2/video/{0}.json',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api:\n '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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\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 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\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 download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // 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 controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n 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 display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n 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\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\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// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, 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 button.pressed = 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 // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n\n // Force a repaint as sometimes Safari doesn't want to fill the screen\n setTimeout(() => repaint(this.target), 100);\n }\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(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n onChange.call(this);\n },\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 !!(\n document.fullscreenEnabled ||\n document.webkitFullscreenEnabled ||\n document.mozFullScreenEnabled ||\n document.msFullscreenEnabled\n );\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 = ['webkit', 'moz', 'ms'];\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\n ? this.player.media\n : 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 this.target.webkitEnterFullscreen();\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","// 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","// ==========================================================================\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","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\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(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\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) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\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 // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('poster', poster);\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch(err => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw err;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n ui.togglePoster.call(this, true);\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n target.pressed = this.playing;\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n\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 // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, 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 this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\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 player.currentTime = (player.duration / 10) * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keycodes should we prevent default\n const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\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 player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n player.forward();\n break;\n\n case 37:\n // Arrow back\n player.rewind();\n break;\n\n case 70:\n // F key\n player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n player.loop = !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 (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n 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 const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n\n setTabFocus(event) {\n const { player } = this;\n const { elements } = player;\n\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n }\n\n // Store reference to event timeStamp\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { elements } = player;\n\n // Keyboard shortcuts\n if (!player.config.keyboard.global && player.config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n event => {\n const { controls } = elements;\n\n // Remove button states for fullscreen\n if (controls && 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 = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(player.timers.controls);\n\n // Set new timer to prevent flicker when seeking\n player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n }\n\n // Listen for media events\n media() {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event),\n );\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(player, player.media, 'canplay', () => {\n toggleHidden(elements.volume, !player.hasAudio);\n toggleHidden(elements.buttons.mute, !player.hasAudio);\n });\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event),\n );\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event),\n );\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(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(player, player.media, 'playing', () => {\n if (!player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (player.ads.enabled && !player.ads.initialized) {\n // Wait for manager response\n player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n }\n });\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n player.restart();\n player.play();\n } else {\n player.togglePlay();\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadLink.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, event => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n }\n\n // Run default and custom handlers\n proxy(event, defaultHandler, customHandlerKey) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n }\n\n // Trigger custom and default handlers\n bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n }\n\n // Listen for control events\n controls() {\n const { player } = this;\n const { elements } = player;\n\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', player.togglePlay, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n\n controls.toggleMenu.call(player, event);\n });\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n event => {\n const code = event.which;\n\n // We only care about space and return\n if (![13, 32].includes(code)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = (100 / rect.width) * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const code = event.keyCode ? event.keyCode : event.which;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n player.play();\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an <input type=\"range\">,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n 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 player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event),\n );\n\n // Polyfill for lower fill in <input type=\"range\"> for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n event => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, elements, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n 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\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n}\n\nexport default Listeners;\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","// @@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","(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 [x, y] = (is.string(input) ? input : this.config.ratio).split(':');\n const padding = (100 / x) * y;\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 // Get poster, if already set\n const { poster } = player;\n\n // Inject the package\n const wrapper = createElement('div', { poster, 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).catch(() => {});\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 controls.setDownloadLink.call(player);\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([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).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 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 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// 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\n // Get poster, if already set\n const { poster } = player;\n\n // Replace media element\n const container = createElement('div', { id, poster });\n player.media = replaceElement(container, player.media);\n\n // Id to poster wrapper\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 .catch(() => {});\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 hl: player.config.hl, // iframe interface language\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 // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n const code = event.data;\n // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n const message =\n {\n 2: '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 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n 100: '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 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n 150: 'The owner of the requested video does not allow it to be played in embedded players.',\n }[code] || 'An unknown error occured';\n\n player.media.error = { code, message };\n\n triggerEvent.call(player, player.media, 'error');\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 // Bail if onReady has already been called. See issue #1108\n if (is.function(player.media.play)) {\n return;\n }\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 and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n if (player.paused && !player.embed.hasPlayed) {\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 // 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 && [1, 2].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\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.isHTML5) {\n html5.extend.call(this);\n } else if (this.isYouTube) {\n youtube.setup.call(this);\n } else if (this.isVimeo) {\n vimeo.setup.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 { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\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 (\n this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n );\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: window.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(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n event => this.onAdsManagerLoaded(event),\n false,\n );\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 // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n }\n\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 // 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';\nimport { getDeep } from './utils/objects';\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 (!getDeep(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 const { sources, type } = input;\n const [{ provider = providers.html5, src }] = sources;\n const tagName = provider === 'html5' ? type : 'div';\n const attributes = provider === 'html5' ? {} : { src };\n\n Object.assign(this, {\n provider,\n type,\n // Check for support\n supported: support.check(type, provider, this.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes),\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', 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.4.5\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, 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 captions: null,\n buttons: {},\n display: {},\n progress: {},\n inputs: {},\n settings: {\n popup: null,\n menu: null,\n panels: {},\n buttons: {},\n },\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.search.length) {\n const truthy = ['1', 'true'];\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 this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\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') || this.media.hasAttribute('webkit-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 // 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 if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.config.autoplay) {\n this.play();\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\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\n get isEmbed() {\n return Boolean(this.isYouTube || this.isVimeo);\n }\n\n get isYouTube() {\n return Boolean(this.provider === providers.youtube);\n }\n\n get isVimeo() {\n return Boolean(this.provider === providers.vimeo);\n }\n\n get isVideo() {\n return Boolean(this.type === types.video);\n }\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 or Infinity before the media has loaded\n const realDuration = (this.media || {}).duration;\n const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\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 : 0);\n }\n\n /**\n * Decrease volume\n * @param {boolean} step - How much to decrease by (between 0 and 1)\n */\n decreaseVolume(step) {\n this.increaseVolume(-step);\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 // 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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\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, false).catch(() => {});\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 captions.toggle.call(this, input, false);\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, false);\n }\n\n /**\n * Get the current caption track index (-1 if disabled)\n */\n get currentTrack() {\n const { toggled, currentTrack } = this.captions;\n return toggled ? 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, false);\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\n // Trigger event on change\n if (hiding !== isHidden) {\n const eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\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 /**\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.call(this, 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 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 // Provider specific stuff\n if (this.isHTML5) {\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 } else if (this.isYouTube) {\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 } else if (this.isVimeo) {\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 }\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.svg b/dist/plyr.svg index 93aa10f7..1c769cb0 100644 --- a/dist/plyr.svg +++ b/dist/plyr.svg @@ -1 +1 @@ -<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><symbol id="plyr-airplay"><path d="M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"/><path d="M4 17h10l-5-6z"/></symbol><symbol id="plyr-captions-off"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-enter-fullscreen"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-muted"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-pip"><path d="M13.293 3.293L7.022 9.564l1.414 1.414 6.271-6.271L17 7V1h-6z"/><path d="M13 15H3V5h5V3H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6h-2v5z"/></symbol><symbol id="plyr-play"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-settings"><path d="M16.135 7.784a2 2 0 0 1-1.23-2.969c.322-.536.225-.998-.094-1.316l-.31-.31c-.318-.318-.78-.415-1.316-.094a2 2 0 0 1-2.969-1.23C10.065 1.258 9.669 1 9.219 1h-.438c-.45 0-.845.258-.997.865a2 2 0 0 1-2.969 1.23c-.536-.322-.999-.225-1.317.093l-.31.31c-.318.318-.415.781-.093 1.317a2 2 0 0 1-1.23 2.969C1.26 7.935 1 8.33 1 8.781v.438c0 .45.258.845.865.997a2 2 0 0 1 1.23 2.969c-.322.536-.225.998.094 1.316l.31.31c.319.319.782.415 1.316.094a2 2 0 0 1 2.969 1.23c.151.607.547.865.997.865h.438c.45 0 .845-.258.997-.865a2 2 0 0 1 2.969-1.23c.535.321.997.225 1.316-.094l.31-.31c.318-.318.415-.781.094-1.316a2 2 0 0 1 1.23-2.969c.607-.151.865-.547.865-.997v-.438c0-.451-.26-.846-.865-.997zM9 12a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol id="plyr-volume"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg>
\ No newline at end of file +<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><symbol id="plyr-airplay"><path d="M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"/><path d="M4 17h10l-5-6z"/></symbol><symbol id="plyr-captions-off"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd" fill-opacity=".5"/></symbol><symbol id="plyr-captions-on"><path d="M1 1c-.6 0-1 .4-1 1v11c0 .6.4 1 1 1h4.6l2.7 2.7c.2.2.4.3.7.3.3 0 .5-.1.7-.3l2.7-2.7H17c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1H1zm4.52 10.15c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41C8.47 4.96 7.46 3.76 5.5 3.76c-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69zm7.57 0c1.99 0 3.01-1.32 3.28-2.41l-1.29-.39c-.19.66-.78 1.45-1.99 1.45-1.14 0-2.2-.83-2.2-2.34 0-1.61 1.12-2.37 2.18-2.37 1.23 0 1.78.75 1.95 1.43l1.3-.41c-.28-1.15-1.29-2.35-3.25-2.35-1.9 0-3.61 1.44-3.61 3.7 0 2.26 1.65 3.69 3.63 3.69z" fill-rule="evenodd"/></symbol><symbol id="plyr-download"><path d="M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zM2 15h14v2H2z"/></symbol><symbol id="plyr-enter-fullscreen"><path d="M10 3h3.6l-4 4L11 8.4l4-4V8h2V1h-7zM7 9.6l-4 4V10H1v7h7v-2H4.4l4-4z"/></symbol><symbol id="plyr-exit-fullscreen"><path d="M1 12h3.6l-4 4L2 17.4l4-4V17h2v-7H1zM16 .6l-4 4V1h-2v7h7V6h-3.6l4-4z"/></symbol><symbol id="plyr-fast-forward"><path d="M7.875 7.171L0 1v16l7.875-6.171V17L18 9 7.875 1z"/></symbol><symbol id="plyr-logo-vimeo"><path d="M17 5.3c-.1 1.6-1.2 3.7-3.3 6.4-2.2 2.8-4 4.2-5.5 4.2-.9 0-1.7-.9-2.4-2.6C5 10.9 4.4 6 3 6c-.1 0-.5.3-1.2.8l-.8-1c.8-.7 3.5-3.4 4.7-3.5 1.2-.1 2 .7 2.3 2.5.3 2 .8 6.1 1.8 6.1.9 0 2.5-3.4 2.6-4 .1-.9-.3-1.9-2.3-1.1.8-2.6 2.3-3.8 4.5-3.8 1.7.1 2.5 1.2 2.4 3.3z"/></symbol><symbol id="plyr-logo-youtube"><path d="M16.8 5.8c-.2-1.3-.8-2.2-2.2-2.4C12.4 3 9 3 9 3s-3.4 0-5.6.4C2 3.6 1.3 4.5 1.2 5.8 1 7.1 1 9 1 9s0 1.9.2 3.2c.2 1.3.8 2.2 2.2 2.4C5.6 15 9 15 9 15s3.4 0 5.6-.4c1.4-.3 2-1.1 2.2-2.4.2-1.3.2-3.2.2-3.2s0-1.9-.2-3.2zM7 12V6l5 3-5 3z"/></symbol><symbol id="plyr-muted"><path d="M12.4 12.5l2.1-2.1 2.1 2.1 1.4-1.4L15.9 9 18 6.9l-1.4-1.4-2.1 2.1-2.1-2.1L11 6.9 13.1 9 11 11.1zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol><symbol id="plyr-pause"><path d="M6 1H3c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1zM12 1c-.6 0-1 .4-1 1v14c0 .6.4 1 1 1h3c.6 0 1-.4 1-1V2c0-.6-.4-1-1-1h-3z"/></symbol><symbol id="plyr-pip"><path d="M13.293 3.293L7.022 9.564l1.414 1.414 6.271-6.271L17 7V1h-6z"/><path d="M13 15H3V5h5V3H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6h-2v5z"/></symbol><symbol id="plyr-play"><path d="M15.562 8.1L3.87.225C3.052-.337 2 .225 2 1.125v15.75c0 .9 1.052 1.462 1.87.9L15.563 9.9c.584-.45.584-1.35 0-1.8z"/></symbol><symbol id="plyr-restart"><path d="M9.7 1.2l.7 6.4 2.1-2.1c1.9 1.9 1.9 5.1 0 7-.9 1-2.2 1.5-3.5 1.5-1.3 0-2.6-.5-3.5-1.5-1.9-1.9-1.9-5.1 0-7 .6-.6 1.4-1.1 2.3-1.3l-.6-1.9C6 2.6 4.9 3.2 4 4.1 1.3 6.8 1.3 11.2 4 14c1.3 1.3 3.1 2 4.9 2 1.9 0 3.6-.7 4.9-2 2.7-2.7 2.7-7.1 0-9.9L16 1.9l-6.3-.7z"/></symbol><symbol id="plyr-rewind"><path d="M10.125 1L0 9l10.125 8v-6.171L18 17V1l-7.875 6.171z"/></symbol><symbol id="plyr-settings"><path d="M16.135 7.784a2 2 0 0 1-1.23-2.969c.322-.536.225-.998-.094-1.316l-.31-.31c-.318-.318-.78-.415-1.316-.094a2 2 0 0 1-2.969-1.23C10.065 1.258 9.669 1 9.219 1h-.438c-.45 0-.845.258-.997.865a2 2 0 0 1-2.969 1.23c-.536-.322-.999-.225-1.317.093l-.31.31c-.318.318-.415.781-.093 1.317a2 2 0 0 1-1.23 2.969C1.26 7.935 1 8.33 1 8.781v.438c0 .45.258.845.865.997a2 2 0 0 1 1.23 2.969c-.322.536-.225.998.094 1.316l.31.31c.319.319.782.415 1.316.094a2 2 0 0 1 2.969 1.23c.151.607.547.865.997.865h.438c.45 0 .845-.258.997-.865a2 2 0 0 1 2.969-1.23c.535.321.997.225 1.316-.094l.31-.31c.318-.318.415-.781.094-1.316a2 2 0 0 1 1.23-2.969c.607-.151.865-.547.865-.997v-.438c0-.451-.26-.846-.865-.997zM9 12a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol id="plyr-volume"><path d="M15.6 3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4C15.4 5.9 16 7.4 16 9c0 1.6-.6 3.1-1.8 4.3-.4.4-.4 1 0 1.4.2.2.5.3.7.3.3 0 .5-.1.7-.3C17.1 13.2 18 11.2 18 9s-.9-4.2-2.4-5.7z"/><path d="M11.282 5.282a.909.909 0 0 0 0 1.316c.735.735.995 1.458.995 2.402 0 .936-.425 1.917-.995 2.487a.909.909 0 0 0 0 1.316c.145.145.636.262 1.018.156a.725.725 0 0 0 .298-.156C13.773 11.733 14.13 10.16 14.13 9c0-.17-.002-.34-.011-.51-.053-.992-.319-2.005-1.522-3.208a.909.909 0 0 0-1.316 0zM3.786 6.008H.714C.286 6.008 0 6.31 0 6.76v4.512c0 .452.286.752.714.752h3.072l4.071 3.858c.5.3 1.143 0 1.143-.602V2.752c0-.601-.643-.977-1.143-.601L3.786 6.008z"/></symbol></svg>
\ No newline at end of file diff --git a/package.json b/package.json index fd992700..bb8829de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plyr", - "version": "3.4.4", + "version": "3.4.5", "description": "A simple, accessible and customizable HTML5, YouTube and Vimeo media player", "homepage": "https://plyr.io", "author": "Sam Potts <sam@potts.es>", @@ -132,13 +132,13 @@ See [initialising](#initialising) for more information on advanced setups. You can use our CDN (provided by [Fastly](https://www.fastly.com/)) for the JavaScript. There's 2 versions; one with and one without [polyfills](#polyfills). My recommendation would be to manage polyfills seperately as part of your application but to make life easier you can use the polyfilled build. ```html -<script src="https://cdn.plyr.io/3.4.4/plyr.js"></script> +<script src="https://cdn.plyr.io/3.4.5/plyr.js"></script> ``` ...or... ```html -<script src="https://cdn.plyr.io/3.4.4/plyr.polyfilled.js"></script> +<script src="https://cdn.plyr.io/3.4.5/plyr.polyfilled.js"></script> ``` ### CSS @@ -152,13 +152,13 @@ Include the `plyr.css` stylsheet into your `<head>` If you want to use our CDN (provided by [Fastly](https://www.fastly.com/)) for the default CSS, you can use the following: ```html -<link rel="stylesheet" href="https://cdn.plyr.io/3.4.4/plyr.css"> +<link rel="stylesheet" href="https://cdn.plyr.io/3.4.5/plyr.css"> ``` ### SVG Sprite The SVG sprite is loaded automatically from our CDN (provided by [Fastly](https://www.fastly.com/)). To change this, see the [options](#options) below. For -reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/3.4.4/plyr.svg`. +reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/3.4.5/plyr.svg`. ## Ads @@ -315,6 +315,7 @@ Note the single quotes encapsulating the JSON and double quotes on the object ke | `quality` | Object | `{ default: 'default', options: ['hd2160', 'hd1440', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny', 'default'] }` | Currently only supported by YouTube. `default` is the default quality level, determined by YouTube. `options` are the options to display. | | `loop` | Object | `{ active: false }` | `active`: Whether to loop the current video. If the `loop` attribute is present on a `<video>` or `<audio>` element, this will be automatically set to true This is an object to support future functionality. | | `ads` | Object | `{ enabled: false, publisherId: '' }` | `enabled`: Whether to enable vi.ai ads. `publisherId`: Your unique vi.ai publisher ID. | +| `urls` | Object | See source. | If you wish to override any API URLs then you can do so here. You can also set a custom download URL for the download button. | 1. Vimeo only diff --git a/src/js/plyr.js b/src/js/plyr.js index 32038b0e..b81c0fc6 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -1,6 +1,6 @@ // ========================================================================== // Plyr -// plyr.js v3.4.4 +// plyr.js v3.4.5 // https://github.com/sampotts/plyr // License: The MIT License (MIT) // ========================================================================== diff --git a/src/js/plyr.polyfilled.js b/src/js/plyr.polyfilled.js index 3fe2af1c..72d241d3 100644 --- a/src/js/plyr.polyfilled.js +++ b/src/js/plyr.polyfilled.js @@ -1,6 +1,6 @@ // ========================================================================== // Plyr Polyfilled Build -// plyr.js v3.4.4 +// plyr.js v3.4.5 // https://github.com/sampotts/plyr // License: The MIT License (MIT) // ========================================================================== |